2011-11-27 172 views
3

我需要一個代碼,當CheckForZero第一次發生,30秒後再次發生,它每30秒進行一次。延遲功能與greasemonkey

var waitForZeroInterval = setInterval (CheckForZero, 0); 

function CheckForZero() 
{ 
    if ((unsafeWindow.seconds == 0) && (unsafeWindow.milisec == 0)) 
    { 
     clearInterval (waitForZeroInterval); 

     var targButton = document.getElementById ('bottone1799'); 
     var clickEvent = document.createEvent ('MouseEvents'); 

     clickEvent.initEvent ('click', true, true); 
     targButton.dispatchEvent (clickEvent); 
    } 
}; 

回答

5

你可以簡單的跟蹤狀態:

var hasRun = false; 
function CheckForZero() { 
    ... snip ... 
    if (!hasRun) { 
     hasRun = true; 
     setInterval(CheckForZero, 30000); 
    } 
} 

我也建議使用的setTimeout(),而不是的setInterval()/ clearInterval()(因爲它並不需要在一個運行循環基礎)。

編輯:我編輯了上述代碼以反映OP的修改要求。我在下面添加了另一個版本來簡化。

setTimeout(CheckForZero, 0); // OR just call CheckForZero() if you don't need to defer until processing is complete 
function CheckForZero() { 
    ... snip ... 
    setTimeout(CheckForZero, 30000); 
} 
+0

此代碼只有一次...我需要它去每30秒 – Riccardo

+0

然後更換的setTimeout()在使用setInterval( )。不過,在初始調用中使用setTimeout(),可以消除cancelInterval()調用。 – sarumont

0

//不需要的setInterval,因爲它使事情更重

var d = new Date(); 
var seconds = d.getSeconds() 
var milliseconds = d.getMilliseconds() 
var msLeft = 60 * 1000 - seconds * 1000 - milliseconds; 
unsafeWindow.setTimeout(doSomething,msLeft) 

function doSomething(){ 
    // your work here 

    unsafeWindow.setTimeout(doSomething,30000); 
}