MutationObserver 即使从未被调用也会监听
MutationObserver listen even if was never called
我正在编写外部脚本。我需要在每 30 秒清除一次的部分中添加一些元素。所以我绑定了 MutationObserver
以在内容被擦除后恢复内容。在测试时,我注意到我的 MutationObserver
即使我从不给他打电话也能正常工作。
这是我创建元素的代码:
function moveFilters(){
if($("#new-filter-place").length == 0){
$("<h1 id='new-filter-place'>TEST</h1>").insertAfter($('#category-top10'));
observeFilters();
}
}
这是我的观察员:
function observeFilters(){
console.log('test');
var target = document.querySelector("#new-filter-place");
var observer = new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
var nodes = Array.from(mutation.removedNodes);
var directMatch = nodes.indexOf(target) > -1;
var parentMatch = nodes.some(parent => parent.contains(target));
if(directMatch || parentMatch){
observer.disconnect();
moveFilters();
}
});
})
var config = {
subtree: true,
childList: true
};
observer.observe(document.body, config);
}
我从未调用过函数 moveFilters
或 observeFilters
,因此页面上没有 ID 为“new-filter-place”的元素,但是当其他元素被擦除时,观察器被触发。
有人可以向我解释一下当我从未调用它时如何触发该函数吗?
好的,经过数小时的调试,我找到了它。其他程序员写了其他脚本,所以基本上他调用了那个脚本。
我正在编写外部脚本。我需要在每 30 秒清除一次的部分中添加一些元素。所以我绑定了 MutationObserver
以在内容被擦除后恢复内容。在测试时,我注意到我的 MutationObserver
即使我从不给他打电话也能正常工作。
这是我创建元素的代码:
function moveFilters(){
if($("#new-filter-place").length == 0){
$("<h1 id='new-filter-place'>TEST</h1>").insertAfter($('#category-top10'));
observeFilters();
}
}
这是我的观察员:
function observeFilters(){
console.log('test');
var target = document.querySelector("#new-filter-place");
var observer = new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
var nodes = Array.from(mutation.removedNodes);
var directMatch = nodes.indexOf(target) > -1;
var parentMatch = nodes.some(parent => parent.contains(target));
if(directMatch || parentMatch){
observer.disconnect();
moveFilters();
}
});
})
var config = {
subtree: true,
childList: true
};
observer.observe(document.body, config);
}
我从未调用过函数 moveFilters
或 observeFilters
,因此页面上没有 ID 为“new-filter-place”的元素,但是当其他元素被擦除时,观察器被触发。
有人可以向我解释一下当我从未调用它时如何触发该函数吗?
好的,经过数小时的调试,我找到了它。其他程序员写了其他脚本,所以基本上他调用了那个脚本。