GreaseMonkey倒计时不起作用?

时间:2010-06-28 08:39:44

标签: javascript greasemonkey

我很困惑,使用greasemonkey setTimeout只是不工作,它从不调用函数,在网上看人们说greasemonkey不支持setTimeout,反正是为了让我的目标(下面)工作吗?

function countdown(time, id) {
   if(document.getElementById(id)) {
       var name = document.getElementById(id);
       var hrs = Math.floor(time / 3600); 
       var minutes = Math.floor((time - (hrs * 3600)) / 60); 
       var seconds = Math.floor(time - (hrs * 3600) - minutes * 60);

       if(hrs>0) {
            name.innerhtml = hrs + 'h ' + minutes + 'm';
       } else if(minutes>0) {
            name.innerhtml = minutes + 'm ' + seconds + 's';
       } else {
            name.innerhtml = seconds + 's';
       }
   } else {
       setTimeout('countdown(' + --time + ',' + id + ')', 100);
   }

   if(time <= 0)
      window.location.reload();
   else
      setTimeout('countdown(' + --time + ',' + id + ')', 1000);
} 

2 个答案:

答案 0 :(得分:2)

问题在于setTimeout的文本参数。它与greasemonkey配合得很好但是如果你使用文本命令而不是回调,那么代码永远不会被执行,因为在setTimeout触发时,greasemonkey沙箱被清除。它尝试使用文本参数wchis运行eval,然后尝试调用当时不存在的函数countdown

目前的计划流程如下:

1. function countdown(){}

2. setTimeout("countdown()", 1000);

3. clearGreasemonkeySandbox();

4. ... wait 1 sec...

5. eval("countdown()"); // <- countdown doesn't exist anymore

所以你应该使用回调,这样就可以使用指向函数的指针而不是完整的句子。

setTimeout(function(){
    countdown(--time, id);
}, 1000);

答案 1 :(得分:1)

最后我最终使用

window.setTimeout(bla, 1000);

window.bla = function() { alert("cool"); }