Javascript Chrome扩展:创建元素时触发事件?

Javascript Chrome扩展:创建元素时触发事件?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我想在文档中添加元素时触发一个事件。我已经阅读了和,但是没有一个事件与元素创建有关 我必须监视DOM,因为我无法控制元素添加到文档中的时间(因为我的Javascript是一个Chrome扩展内容脚本)对于最简单的选项,您可能需要检查哪个元素实际上是您所追求的“DOM侦听器”。但是,应谨慎使用,因为它有可能是相当重的、性能方面的 如果您更喜欢“滚动您自己的”-with.on()应该适用于所有当前和将来的元素-但是添加的元素需要与选择器匹配。例如,如果将一个事件关联到.myClass的所有类,然后将

我想在文档中添加元素时触发一个事件。我已经阅读了和,但是没有一个事件与元素创建有关


我必须监视DOM,因为我无法控制元素添加到文档中的时间(因为我的Javascript是一个Chrome扩展内容脚本)

对于最简单的选项,您可能需要检查哪个元素实际上是您所追求的“DOM侦听器”。但是,应谨慎使用,因为它有可能是相当重的、性能方面的


如果您更喜欢“滚动您自己的”-with.on()应该适用于所有当前和将来的元素-但是添加的元素需要与选择器匹配。例如,如果将一个事件关联到
.myClass
的所有类,然后将同一类的新元素注入DOM,则应该触发该事件。实际上,.on()API从以前版本的jQuery中汇总了bind/live/delegate,后两个版本针对当前和未来的DOM元素。

作为@SpaceBison答案的补充,您可以在创建这些元素时创建自己的事件。例如:

function create_element() {
    // Create an element
    $( 'body' ).append( "<p>Testing..</p>" )
    // Trigger
    $( 'body' ).trigger( 'elementCreated' );
}
function monitor_elements() {
    $("body").on("elementCreated", function(event){
    alert('One more');
    });
}

$(document).ready(function(){

     monitor_elements();

     for (var i=0; i < 3; i++) {
         create_element();
     }

});
函数创建_元素(){
//创建一个元素
$('body')。追加(“测试..

”) //触发 $('body').trigger('elementCreated'); } 功能监视器_元素(){ $(“body”)。在(“elementCreated”上,函数(事件){ 警惕(“再来一次”); }); } $(文档).ready(函数(){ 监视元素(); 对于(变量i=0;i<3;i++){ 创建_元素(); } });
实例:


但当然,它只在创建自己的元素时有用。

如前所述,我不是在创建自己的元素,因此在创建元素时触发事件不是一个选项


最好的解决方案是突变观察者API,它提供了友好的界面。

我知道这是一个老问题,已经有了答案,但由于情况发生了变化,我想我应该为登陆此页面寻找答案的人添加一个更新的答案

已被弃用。根据MDN(关于
DOM突变事件
):

已弃用
此功能已从Web上删除。尽管某些浏览器可能仍然支持它,但它正在被删除。不要在旧项目或新项目中使用它。使用它的网页或Web应用程序可能随时中断

人们应该使用新的,这也更有效。
(库现在为这个新API提供了一个有用的接口。)

用法示例:

// Create an observer instance.
var observer = new MutationObserver(function (mutations) {
  mutations.forEach(function (mutation) {
    console.log(mutation.type);
  });
});

// Config info for the observer.
var config = {
  childList: true, 
  subtree: true
};

// Observe the body (and its descendants) for `childList` changes.
observer.observe(document.body, config);

...

// Stop the observer, when it is not required any more.
observer.disconnect();

谢谢@SpaceBison。在()上使用滚动我自己需要什么?如果有必要,我很乐意使用livequery,但如果可能的话,我希望避免使用插件。如果您希望自定义事件在添加项时触发,请遵循Luiz Fernando的回答-如果您只想使用内置事件,但在创建元素时触发它们,你需要一个选择器来匹配已经存在和将要创建的元素,并使用on()将它们连接起来-只要新元素与选择器匹配,事件将为任何添加的元素以及预先存在的元素触发。这对于Chrome扩展非常有用。非常感谢!对于那些想要快速运行代码的人:将问题和公认的答案结合起来,作为工作代码。不,这很好!我讨厌StackOverflow与web技术如此过时。我已将此标记为已接受的答案。