我很困惑,使用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);
}
答案 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"); }