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技术如此过时。我已将此标记为已接受的答案。