【问题标题】:jQuery on() for dynamically added elements, which use stopPropagation()jQuery on() 用于动态添加的元素,使用 stopPropagation()
【发布时间】:2014-09-28 19:49:17
【问题描述】:

假设,我们有几个动态添加 <div /> 在一个页面上,我们需要给它们每个绑定一个点击事件。 通常,我们会使用:

$(document).on( 'click', 'div', function() {
    // ...
});

但我需要防止在点击这些 div 后冒泡。所以我尝试使用:

$(document).on( 'click', 'div', function( e ) {
    e.stopPropagation();
    // ...
});

这不起作用,因为点击没有到达文档元素。我想念 live() 函数,因为它可以将事件直接绑定到新元素,而不是文档。

那么我们怎样才能使这个工作呢?提前谢谢!


更新

我发现了问题。正如 Ninsly 所写,事件确实到达了文档元素。

在我的应用中有很多 ajax,我有 2 个函数,绑定到这些 div。

第一个有我在上面发布的代码:

$(document).on( 'click', 'div', function( e ) {
    e.stopPropagation();
    // ...
});

第二个是在页面上已经有一个div之后绑定的,所以我使用了:

$('div').click( function( e ) {
    e.stopPropagation();
    // ...
});

第二个有效,第一个 - 没有。我尝试以与第一个函数相同的方式重写第二个函数 - 现在一切正常。

【问题讨论】:

  • 它确实到达了文档元素 (See Fiddle)。它会在文档元素处停止传播。
  • "我想念live() 函数,因为它可以将事件直接绑定到新元素,而不是文档。"这不是真的,使用live 事件委托的目标是document 对象。主要是因为这个原因,它已被弃用和删除。
  • stopImmediatePropagation ???

标签: jquery


【解决方案1】:

返回假;将在这种情况下解决问题。

和写法一样

event.preventDefault();
event.stopPropagation();

它将阻止事件的默认操作,并阻止事件通过 DOM 冒泡:)

【讨论】:

  • 事件已冒泡 - 事件处理程序放置在document 对象上。
  • +1 to @Pointy 关于这一点 - 事件传播必须在 到达相关父元素之前停止的想法(因此你不能简单地使用 @ 987654323@) 是问题的症结所在。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 2021-07-09
  • 2012-01-12
相关资源
最近更新 更多