2

我为 Facebook 编写了一个用户脚本,它将类似的通知组合在一起。现在,仅使用带有旧通知的静态 HTML 页面,脚本可以 100% 运行。

这就是问题所在:默认情况下保存通知的 DIV 在用户单击通知按钮之前没有通知。Facebook 有一个onclick显示 DIV(通知菜单)并使用 AJAX 获取通知的内联事件。由于我的用户脚本只在启动时运行,它在那里找不到任何东西——它对页面没有影响。我尝试使用 .click() 事件,但是当您单击通知按钮时,它会运行我的代码。问题是,Facebook 仍在运行它的 AJAX 通知请求,这意味着我的脚本仍然没有通知可以使用,因此它没有任何效果。

我不想使用通用的 setTimeout,因为我不希望用户必须先看到通知,然后突然看到它们。有没有办法监控 DIV,所以一旦添加了通知,它就会运行?或者一旦 Facebook 完成它的 AJAX 请求,它就会运行我的代码?

4

3 回答 3

1

您可以setInterval()监控 div 的 innerHTML,一旦填充就可以运行。

于 2010-06-20T00:33:39.117 回答
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);

上面的所有超时代码都可能是可删除的,具体取决于您的用户脚本正在做什么。

于 2010-06-22T20:36:20.183 回答
-1

也许您可以添加一个 setTimeout 循环。就像是

setTimeout(function(){
/* check for divs */

if(/* divs are found */){
//apply code
}
else {
setTimeout(/* loop again */);
}

},1000);
于 2010-06-20T00:32:31.743 回答