功能完成后运行代码或DIV出现

时间:2010-06-20 00:25:16

标签: javascript jquery facebook greasemonkey userscripts

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

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

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

3 个答案:

答案 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);