【问题标题】:jQuery event delegation for when a selector comes into existence?选择器何时存在的jQuery事件委托?
【发布时间】:2014-11-23 20:52:14
【问题描述】:

假设我想更改任何新创建的特定 DOM 元素的文本。例如:

(不是真正的 API,我意识到)

$('body').on('creation', '.change-this', function() {
  $(this).text('Boom!');
});

因此,如果我以编程方式创建 <p class="change-this"> 并将其添加到 DOM(通过 jQuery 或其他方式),则会触发上述操作。这是jQuery可以做的吗?我能想到的就是,当我以编程方式添加任何 HTML 时,执行 $.trigger('creation') 并准备好处理这些事件的处理程序。

【问题讨论】:

  • 我认为调用$.trigger() 可能是最简单的解决方案。不幸的是,没有可靠的 DOM 元素创建事件处理程序:stackoverflow.com/questions/7434685/…
  • (上面的链接还有一些其他有趣的想法可能对你有帮助。)
  • 您可能想了解MutationObserver
  • 试试这个:jsfiddle.net/g0eLLf95
  • 请注意,旧版浏览器不支持 MutationObserver。

标签: jquery jquery-delegate


【解决方案1】:

您想跟踪您的全新商品吗?您可以使用自定义事件来执行此操作。由于您使用的是 jQuery,您可以使用 .trigger() 方法来创建您的事件。

例如,您需要在每次创建元素时触发事件。因此,在您的代码中,您将添加如下内容:

... // Your code goes here
new_item = '<p class="change-this">'; // The DOM that you will inject
container.append(new_item); // Injecting item into DOM
container.trigger('creation', []); // Firing a event signaling that a new item was created
...

然后,您将为这个自定义事件创建一个监听器:

container.on('creation', function() {
    console.log("Yay! New item added to container!");
});

检查这个sn-p:

$('#add').on('click', function() {

  var item = '<p>New item</p>',
      container = $('#container');
  
  container.append(item);
  container.trigger('creation');
});


$('#container').on('creation', function () {
  var new_message = 'New Item added!<br>';
  
  $('#message').append(new_message);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="add">add</button>
<b id="message"></b>
<div id="container"></div>

请记住,如果您想使用自定义跟踪来跟踪元素,您只需要创建不同的自定义事件并处理其触发器。

所以,就是这样。 jQuery 为我们提供了一种简单而美观的方式来处理自定义事件。太棒了!

如需更多信息,您可以查看以下链接: jQuery.trigger() - http://api.jquery.com/trigger/

引入自定义事件 - http://learn.jquery.com/events/introduction-to-custom-events/

自定义事件 - https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent

祝你好运!

【讨论】:

  • 对于不需要手动调用$.trigger() 的更自动化的解决方案,请查看github.com/brandonaaron/livequery(以及有关此问题的上述cmets)。但我个人认为马修斯的解决方案是最简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2017-01-17
  • 2011-02-20
相关资源
最近更新 更多