【问题标题】:Delegate to capture two form submissions委托捕获两个表单提交
【发布时间】:2012-09-05 09:54:30
【问题描述】:

使用以下函数捕获两个动态生成的表单提交,但不会阻止它们的提交。

$('body').delegate('.edit_faq, .new_faq', 'submit', function(e){
      e.preventDefault();
      //voodoo
    });

我正在使用以下内容,使用live。这可行,但 live 已贬值,最终结果是此代码最终成为一个灵活的插件。

$('.edit_faq').add('.new_faq').live('submit', function(e){
  e.preventDefault();
  //magic
});

【问题讨论】:

  • 这应该可以。您使用的是什么 jquery 版本以及什么浏览器? jsfiddle 上的示例会更容易回答,而且制作测试用例可以发现错误。

标签: javascript jquery delegates jquery-events


【解决方案1】:

你写的确实有效。

检查:

http://jsfiddle.net/peuqU/

按下 run as jsfiddle 有时需要在测试提交之前刷新。

我只能用 chrome 23 对其进行测试。

【讨论】:

    【解决方案2】:

    尝试on,这是推荐的方式,返回false:

    $('body').on('submit', '.edit_faq, .new_faq', function(e){
          e.preventDefault();
         //Do your stuff here.
    
        });
    

    至于为什么还会出现提交,可能是页面某处出现了JS错误?

    【讨论】:

    • 为什么返回 false 和 preventDefault?
    • 那行不通。此外,该链接澄清了在这种情况下 return false 不需要,正如我所怀疑的那样。
    【解决方案3】:

    已修复--

    问题是代码需要被包装在一个文档 onReady:

    $(document).ready(function(){
      $('body').on('submit', '.edit_faq, .new_faq', function(e){
          e.preventDefault();
          //voodoo
      });
    })
    

    我突然想到,既然 live 不需要准备好,那也许这仍然是错误的?

    【讨论】:

    • 这就是解决方案。如果我没记错的话,也需要 document.ready。
    • 首先,您将事件处理程序附加到body,这在加载DOM 内容之前可能不存在。在第二个中,处理程序被附加到 document 本身。
    • 那么,我可以通过附加到 $(document) 来绕过 onready 的需要吗?
    • 我认为您不应该绕过它,因为无法保证它在浏览器中始终如一地工作。
    • @SoonDead 这就是live 的工作原理,因此它可以跨浏览器工作。
    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2016-01-02
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2016-02-18
    相关资源
    最近更新 更多