我为Facebook编写了一个用户脚本,它将类似的通知组合在一起。现在,只使用带有旧通知的静态HTML页面,脚本可以100%运行。
以下是问题:默认情况下保留通知的DIV,在用户点击通知按钮之前,其中没有通知。 Facebook有一个内联onclick
事件,显示DIV(通知菜单)并使用AJAX来获取通知。由于我的用户脚本只在启动时运行,因此它什么都没找到 - 它对页面没有任何影响。我尝试使用.click()事件,但是当您单击Notifications按钮时它会运行我的代码。问题是,Facebook仍在运行它的通知的AJAX请求,这意味着我的脚本仍然没有通知,使其无效。
我不想使用通用的setTimeout,因为我不希望用户以前必须看到通知,然后突然看到它们。有没有办法监控DIV,所以一旦添加通知,它会运行?或者,一旦Facebook完成它的AJAX请求,它将运行我的代码?
答案 0 :(得分:1)
你可以setInterval()
监控div的innerHTML,一旦填充就可以运行。
答案 1 :(得分:0)
以下是问题:默认情况下保留通知的DIV,在用户点击通知按钮之前,其中没有通知。 Facebook有一个内联的onclick事件,显示DIV(通知菜单)并使用AJAX来获取通知。
...
我不想使用通用的setTimeout,因为我不希望用户以前必须看到通知,然后突然看到它们。有没有办法监控DIV,所以一旦添加通知,它就会运行?
是的,有:
var notificationDiv = document.getElementById(...);
var lastTimeoutID = null;
var main = function(evt){
// evt.target is the inserted element
// if you expect more elements, then do the following:
lastTimeoutID = setTimeout(function(){
lastTimeoutID = null;
// uncomment below block if you only need to do the work once.
/*
notificationDiv.removeEventListener("DOMNodeInserted", main, false);
*/
// do your work here.
}, 500); // waiting 500ms for next element to be added, otherwise doing work.
if (lastTimeoutID) {
clearTimeout(lastTimeoutID);
lastTimeoutID = null;
}
};
notificationDiv.addEventListener("DOMNodeInserted", main, false);
上面的所有超时代码都可以删除,具体取决于用户脚本正在做什么。
答案 2 :(得分:-1)
也许你可以添加一个setTimeout循环。像
这样的东西setTimeout(function(){
/* check for divs */
if(/* divs are found */){
//apply code
}
else {
setTimeout(/* loop again */);
}
},1000);