发布与jQuery附加的动态输入

时间:2013-11-25 01:46:39

标签: javascript php jquery html ajax

我发现了多个相同的问题,其中包括:

大多数问题是由于在表格/ div中打开表单或HTML的其他问题引起的。我不相信我有这些问题;我怀疑我的javascript需要调整。

我正在使用jQuery:

<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
</head>
  1. 点击添加链接后,新表格行会附加到tbody.newRow

  2. 点击.remove时,系统会要求您确认。确认后,该行将被删除。

  3. input.Value失去焦点时,表单会通过ajax提交。

  4. jQuery的:

    $(document).ready(function() {
      $(".add").on('click', function() {
        $("tbody.newRow").append(
          '<tr><td><input type="text" name="NewJobLeviesId[]" class="JobLeviesId" /><input type="text" name="NewValue[]" class="Value" /><input type="text" name="MasterId[]" class="Values" /><input type="text" name="LUPChoiceId[]" class="Values" /><input type="text" name="SortOrder[]" class="Values" /></td><td class="removeSelection"><a href="#" class="remove">Remove</a></td></tr>'
        );
      });
      $("tbody").on('click', '.remove', function() {
        $(this).parent().append($(
          '<div class="confirmation"><a href="#" class="removeConfirm">Yes</a><a href="#" class="removeCancel">No</a></div>'
        ))
        $(this).remove();
      });
      $("tbody").on('click', '.removeConfirm', function() {
        $(this).parent().parent().parent().remove();
      });
      $("tbody").on('click', '.removeCancel', function() {
        $(this).parent().parent().append(
          '<a href="#" class="remove">Remove</a>');
        $(this).parent().remove();
      });
      var formTwo = $('.ajaxTwo'); // contact form
      // form submit event
      $(".Value").blur(function() {
        $.ajax({
          type: 'POST', // form submit method get/post
          dataType: 'html', // request type html/json/xml
          data: formTwo.serialize(), // serialize form data 
          success: function(data) {
            url: 'functions.php'; // form action url
          },
          error: function(e) {
            console.log(e)
          }
        });
      });
    });
    

    html表单。 ajax与未动态添加的现有行完美配合。添加行位于表格页脚看起来很漂亮。表单作为数组发布。

    <form class="ajaxTwo" method="post">
        <table>
        <tbody class="newRow">
            <tr>
              <td>
                  <input type="text" name="NewJobLeviesId[]" class="JobLeviesId" />
                  <input type="text" name="NewValue[]" class="Value" />
                  <input type="text" name="MasterId[]" class="Values" />
                  <input type="text" name="LUPChoiceId[]" class="Values" />
                  <input type="text" name="SortOrder[]" class="Values" />
              </td>
              <td class="removeSelection">
                  <a href="#" class="remove">Remove</a>
              </td>
            </tr>
        </tbody>
       <tfoot>
            <tr>
               <td>
                   <a href="#" class="add">Add Row</a>
               </td>
            </tr>
        </tfoot>
        </table>
    </form>
    
    最后是php。每行都使用PDO预处理语句插入到我的数据库表中。

    if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])){
        if(isset($_POST['NewJobLeviesId'])) {
            for($i=0; $i<count($_POST['NewJobLeviesId']); $i++) {
              $NewJobLeviesId = $_POST['NewJobLeviesId'][$i];
              $NewValue = $_POST['NewValue'][$i];
              $MasterId = $_POST['MasterId'][$i];
              $LUPChoiceId = $_POST['LUPChoiceId'][$i];
              $SortOrder = $_POST['SortOrder'][$i];
              $sql = "INSERT INTO joblevies (JobLeviesId,Value,MasterId,LUPChoiceId,SortOrder) VALUES (:JobLeviesId,:Value,:MasterId,:LUPChoiceId,:SortOrder)";
            $q = $db->prepare($sql);
            $q->execute(array(':JobLeviesId'=>($NewJobLeviesId),':Value'=>($NewValue),':MasterId'=>($MasterId),':LUPChoiceId'=>($LUPChoiceId),':SortOrder'=>($SortOrder)));
            }
        }
    }
    

    同样,这非常有效。只有动态添加的输入才有问题。我错过了什么?

2 个答案:

答案 0 :(得分:1)

动态创建的dom元素没有您在$(document).ready(...上附加的任何事件,因为在附加事件时它们尚不存在。因此$('.Value').blur(...内容仅附加到第一个表单,而不是任何未来表单。因此,每次创建新行时附加事件,所以可能是这样的:

首先,将绑定操作委托给自己的函数

function attachSubmitEvent() {
    // form submit event
    //remove old events first
    $(".Value").off();
    $(".Value").blur(function () {
        var formTwo = $('.ajaxTwo'); // contact form
        $.ajax({
            type: 'POST', // form submit method get/post
            dataType: 'html', // request type html/json/xml
            data: formTwo.serialize(), // serialize form data 
            success: function (data) {
                url: 'functions.php'; // form action url
            },
            error: function (e) {
                console.log(e)
            }
        });
    });
}

然后在您的document.ready中调用该函数

attachSubmitEvent();

然后,为了确保它们也附加到新元素,在创建新元素时再次调用它

$(".add").on('click', function () {
$("tbody.newRow").append('<tr><td><input type="text" name="NewJobLeviesId[]" class="JobLeviesId" /><input type="text" name="NewValue[]" class="Value" /><input type="text" name="MasterId[]" class="Values" /><input type="text" name="LUPChoiceId[]" class="Values" /><input type="text" name="SortOrder[]" class="Values" /></td><td class="removeSelection"><a href="#" class="remove">Remove</a></td></tr>');
attachSubmitEvent(); //now everyone has the event attached.
});

答案 1 :(得分:1)

对于您的表单提交活动,请尝试:

$("tbody").on('focusout', '.Value', function() {
    ...
});

您也可以在此事件处理程序中使用blur,但文档建议使用focusout以获得清晰度(请参阅jQuery on()方法文档的“其他注释”部分:http://api.jquery.com/on/