当新节点插入 dom 时是否会触发 jquery 事件?

新手上路,请多包涵

将 dom 元素插入 dom 时,是否会在 dom 元素上触发事件 jquery?

例如,假设我通过 ajax 加载一些内容并将其添加到 DOM 中,在其他一些 javascript 中我可以使用 .live() 添加一个事件,这样当一个与特定选择器匹配的事件被添加到 DOM 时,事件就会触发说元素。类似于 $(document).ready() 但动态添加到 DOM 的内容。

我梦想的是:

 $('.myClass').live('ready', function() {
    alert('.myClass added to dom');
});

如果 jquery 不支持这样的事情,那么有没有另一种方法可以在不修改实际执行初始 dom 操作的代码的情况下实现此功能?

原文由 3urdoch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 623
2 个回答

.livequery() 插件 仍然满足这个利基需求,如下所示:

 $('.myClass').livequery(function() {
  alert('.myClass added to dom');
});

如果你像上面那样 给它一个回调函数,它会为它找到的每个新元素运行,包括最初和添加它们时。函数内部 this 指的是刚刚添加的元素。

.live() 监听冒泡的事件,所以不适合这种“添加元素时”的情况,在这方面, .livequery() (插件)没有 完全 被添加所取代 .live() 核心,只有事件冒泡部分(大部分)是。

原文由 Nick Craver 发布,翻译遵循 CC BY-SA 3.0 许可协议

已弃用:根据@Meglio 下面的评论, DOMNodeInserted 事件已弃用,并将在未来某个未知时间从网络上删除。为获得最佳结果,请开始学习 MutationObserver API

请参阅 下面 的@dain 的回答。

如果您将 “DOMNodeInserted”事件 直接绑定到文档或正文,则每次在任何地方插入任何内容时都会执行该事件。如果您希望回调仅在添加特定类型的元素时运行,您最好使用 委托事件

通常,如果您要向 DOM 添加一类元素,您会将它们添加到一个共同的父级。所以像这样附加事件处理程序:

 $('body').on('DOMNodeInserted', '#common-parent', function(e) {
  if ($(e.target).attr('class') === 'myClass') {
    console.log('hit');
  }
});

基本上与 上面 Myke 的 答案相同,但由于您使用的是委托事件处理程序而不是直接事件处理程序,因此其中的代码将被触发的频率较低。

笔记:

 $('body').on('DOMNodeInserted', '.myClass', function(e) {
  console.log(e.target);
});

这似乎也有效……但我不知道为什么。

原文由 Ziggy 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题