2011-09-25 65 views
10

我正在使用JavaScript和jQuery。我有以下腳本每30秒提醒hiJavaScript - jQuery間隔

$(document).ready(function() { 
    alert("hi"); 
setInterval(function() { 
    alert("hi"); 
}, 30000); 
}); 

我想提醒hi加載網頁時(當文件/頁面變得完全加載)和每30秒間隔後(如hi(0) - hi(30秒) - hi(60)..等等)。但我的解決方案適用於兩個實例。一個用於DOM準備,另一個用於循環。有沒有辦法在單個實例中執行相同的操作?

你可以看到我的小提琴here

+0

什麼問題?您的jsFiddle最初和每隔30秒都會按照代碼指定的方式發出警報。在時間流逝之前,setInterval不會調用它的函數。如果你想讓它最初執行,那麼你就像你一樣調用它。如果這是一個更復雜的邏輯你想在這兩個地方調用,然後把它放在一個命名函數,你可以調用這兩個地方。 – jfriend00

回答

18

您可以改用setTimeout,並讓回調自行重新安排。

$(function() { 
    sayHi(); 

    function sayHi() { 
     setTimeout(sayHi,30000); 
     alert('hi'); 
    } 
}); 
+0

爲什麼不使用setInterval? – user2019515

+0

@ user2019515 - 我瞭解OP希望單個函數的調用。 '$(function(){sayHi(); setInterval(sayHi,30000); function sayHi(){alert('hi');});'也可以工作,但有單獨的函數實例。 – tvanfosson

9

把你的代碼包裝在一個函數中。然後,傳遞給函數的第一個參數setInterval,並調用該函數:

$(document).ready(function() { 
    //Definition of the function (non-global, because of the previous line) 
    function hi(){ 
     alert("hi"); 
    } 

    //set an interval 
    setInterval(hi, 30000); 

    //Call the function 
    hi(); 
}); 
1

不,那是不可能的setInterval。你可以使用的setTimeout例如:

function foo() { 
    alert('hi'); 
    setTimeout(foo, 30000); 
} 

$(function() { 
    foo(); 
}); 
1
$(function() { 

    function heythere() { 
     alert('hi'); 
     setTimeout(heythere,30000); 
    } 

    heythere(); 

}); 

如果你想讓它只有30秒後運行一次,你正在尋找使用setTimeoutsetInterval

3

嗯,有可能是在只需一個電話做這件事的方式..

setInterval(
    (function x() { 
     alert('hi'); 
     return x; 
    })(), 30000); 

另一種解決方案是使用arguments.callee,但因爲它是現在已經過時,所以一般不建議用它。

setInterval(
    (function() { 
     alert('hi'); 
     return arguments.callee; 
    })(), 30000);