【发布时间】:2015-09-12 20:30:30
【问题描述】:
我正在尝试使用 Greasemonkey 为 Facebook 的 时间轴日志 页面制作脚本。
我需要捕捉两种事件:
1) URL 更改(因为更改是在 Facebook 上使用 AJAX 进行的,因此页面没有完全重新加载,脚本也没有)。
2)一些元素的外观。
我尝试制作两个 MutationObservers,一个用于捕获 URL 更改,另一个用于捕获元素外观。
但它似乎只触发了一个(url_mutation_observer)。
这是我的一些代码:
function handling_url_change(mutations){
mutations.forEach(function (mutation){
if (check_timeline()){
if (!buttons_added){
var element = $(document).find(button_location);
if (element && element.length > 0){
add_buttons();
}
}
}else if (set){
reset();
}
});
}
function handle_deletion(mutations){
mutations.forEach(function (mutation){
if (mutation.addedNodes){
for (var i = 0; i < mutation.addedNodes.length; i++){
if (isheader(mutation.addedNodes[i])){
mutation.addedNodes[i].remove()
}else if (isactivity(mutation.addedNodes[i])){
delete_activity(mutation.addedNodes[i]);
}
return true;
}
}
});
return true;
}
/*
** Mutation observers :
*/
var url_mutation_observer = new MutationObserver(handling_url_change);
var delete_mutation_observer = new MutationObserver(handle_deletion);
我有一些问题:
1) 不是每个 MutationObserver 都捕捉到每个突变吗?
2) 添加按钮(就像我的脚本一样)是否算作突变?
3) 如果我添加一个带有由添加此类元素触发的回调函数的元素。不会有递归和死循环的风险吗?
4) 是否可以使用 MutationObserver 仅捕获 URL 更改,而仅使用其他元素捕获某些元素的外观? (为了确保每个人只捕获他需要捕获的内容,我不知道该怎么做,我使用检查页面的函数检查了 url,而不是使用检查突变是否为“UrlChangeMutation”的函数或类似的东西)。
5) 我能做什么?
注意:
如果你也想,这里是带有console.log() 调试调用的完整脚本。
http://dpaste.com/3NWV08J
NB2:
如果您还希望这个脚本没有 console.log() 调用:
http://dpaste.com/3AH8YF5
【问题讨论】:
标签: javascript mutation-observers