javascript - DOMNodeInserted 未按预期工作?

标签 javascript jquery dom jquery-events

基于this question ,我写了以下代码:

$(function() {
    $( document ).on('DOMNodeInserted',"span:contains('Suggested Post')", function() {
        console.log("New Suggested Post found");
    })
})

当我向下滚动页面并创建这些元素时,我没有看到我期望看到的控制台消息。但是,如果我在控制台中手动输入 $("span:contains('Suggested Post')").length ,输出会继续增加。

想法?

@Barmar 请求的片段。它的行为与我的现实世界场景并不完全一样,但它仍然不正确......

$(document).on('DOMNodeInserted', "div:contains('Banana')", function() {
  console.log("new banana detected!");
});

$('#btn').on('click', function() {
  var fruit = '';
  switch (Math.floor((Math.random() * 3) + 1)) {
    case 1:
      fruit = 'Apple'
      break;
    case 2:
      fruit = 'Orange'
      break;
    case 3:
      fruit = 'Banana'
      break;
    default:
      fruit = "WTF"
  }
  $('#fakeDocument').append('<div>' + fruit + '</div>');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="fakeDocument">
  <strong>Banana Detector</strong>
  <button id="btn" type="button">Add Banana!</button>
</div>

最佳答案

您需要将委托(delegate)绑定(bind)到要插入的元素的直接父元素。

其原因是 DOMNodeInserted 事件冒泡。如果将其绑定(bind)到外部容器,它将冒泡到包含 DIV,并且由于 Banana Detector 标题,该 DIV 将匹配 :contains(Banana)。即使您将其移出容器,它也会匹配,因为之前添加的节点包含 Banana

这就是为什么在实际匹配时会触发两次:它会为匹配的新元素触发一次,并为始终匹配的容器再次触发。

我最初认为 event.StopPropagation() 可以解决问题,但事实并非如此。当有实际比赛时,它将防止双重射击。但当没有匹配时它仍然会触发 - 事件不会在新元素上触发(因为它不匹配),因此 event.stopPropagation() 不会运行,所以它冒泡到匹配的容器中。

$("#fakeDocument").on('DOMNodeInserted', "div:contains('Banana')", function() {
  console.log("new banana detected!");
});

$('#btn').on('click', function() {
  var fruit = '';
  switch (Math.floor((Math.random() * 3) + 1)) {
    case 1:
      fruit = 'Apple'
      break;
    case 2:
      fruit = 'Orange'
      break;
    case 3:
      fruit = 'Banana'
      break;
    default:
      fruit = "WTF"
  }
  $('#fakeDocument').append('<div>' + fruit + '</div>');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="fakeDocument">
  <strong>Banana Detector</strong>
  <button id="btn" type="button">Add Banana!</button>
</div>

关于javascript - DOMNodeInserted 未按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40617644/

相关文章:

javascript - 元素 css 遵循 jquery 声明,而不是样式表

javascript - 在字符串中的一些随机数字后面添加空格

javascript - 等列 jQuery

jQuery 选择器用于除第一行之外的每个表上除第一行之外的每一行

java - 将大 XML 文件(100k 条记录)导入数据库

javascript - 如何动态更新文本区域的值,同时仍然能够编辑它 - React

javascript - 通过javascript和jquery将时间转换为hrs

javascript - 我们可以通过电子商务交易发送自定义维度(用户范围)吗?

javascript - 按钮打开特定的 Accordion 选项卡

javascript - jquery 显示/隐藏比例不能按预期工作