jQuery第二次运行但不是第一次运行

时间:2017-11-16 18:59:26

标签: jquery ajax

我有以下代码在我的网站上发表评论

$('#leave-comment').keypress(function(e) {
    if (e.which == 13 && !e.shiftKey) {
        post_comment();
    }
});

然后以下是post_comment函数

$('#leave-comment').submit();

$('#frm-leave-comment').unbind('submit');

$('#frm-leave-comment').submit(function(e) {

    // Code here for submit

}

当我第一次按下输入时,它会按下按键(通过发出警报进行验证)。它也会按下正确的键(输入 - 13),它还会运行post_comment函数。

问题是它没有提交表格

$('#frm-leave-comment').submit(function(e) {

然而,我第二次按回车键确实提交了表格并且运作正常。

需要注意的一点是,第一个代码块是从加载了ajax的页面运行的。

第二个代码块在页面加载时加载了外部javascript。

我检查过jquery没有加载两次。

还有其他一些令人讨厌的事情发生,如果我将顶部代码块包装在$(文档)中。现在它不会触发代码,并且在我的网站上的其他地方使用stopPropagation时,它会工作第二个时间,但不是第一次,所以我认为这只是加载jquery的方式的问题,而不是上面的代码。

有没有人知道这里可能会发生什么?

1 个答案:

答案 0 :(得分:1)

据推测,您的表单没有任何默认的“提交”操作?至少这似乎是您在上述评论中声称的内容:

  

当我打电话给提交时,我输入e.preventDefault来停止提交表单。

让我们分解你的功能:

首次调用该函数:

  1. $('#leave-comment').submit(); // does nothing, by your design
  2. $('#frm-leave-comment').unbind('submit'); // removes any existing submit handler, so doesn't observably do anything
  3. $('#frm-leave-comment').submit(function(e) { /*...*/ }); // adds a new submit handler, to be used *the next time* the form is submitted
  4. 第二次调用该函数:

    1. $('#leave-comment').submit(); // invokes your submit handler
    2. $('#frm-leave-comment').unbind('submit'); // removes your submit handler
    3. $('#frm-leave-comment').submit(function(e) { /*...*/ }); // re-adds *the same submit handler* you just removed
    4. 因此,当您第一次执行此功能时,您实际上并未提交任何内容。您只是绑定要在下次执行此函数时使用的提交处理程序。

      你保持解除绑定并重新绑定相同的提交处理程序。

      这太过于复杂了。完全删除post_comment函数,并在页面加载时绑定您的提交处理程序:

      $(function () {
          $('#frm-leave-comment').submit(function(e) {
              // Code here for submit
          }
      });
      

      然后在您的keypress处理程序中,只需提交表单:

      $('#leave-comment').keypress(function(e) {
          if (e.which == 13 && !e.shiftKey) {
              $('#leave-comment').submit();
              $('#frm-leave-comment').submit();
          }
      });