2011-09-25 4 views
10

jQueryでJavaScriptを使用しています。私は30秒ごとにhiに警告する次のスクリプトを持っています。JavaScript - jQuery interval

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

私は、ページのロード時hiを警告したい(文書/ページが完全にロードされたとき)、その後、30秒ごとの間隔(のようhi(0)上 - hi(30代) - hi(60年代)..等)。しかし、私のソリューションは2つのインスタンスで動作します。 1つはDOMの準備ができていて、もう1つはループしています。同じインスタンスを1つのインスタンスで実行する方法はありますか?

私のフィドルを見ることができますhere

+0

問題は何ですか?あなたのjsFiddleアラートは、最初と30秒ごとにコードが指定したとおりに正確に行われます。 setIntervalは時間が経過するまでその関数を呼び出さない。それが最初に実行されるようにしたい場合は、それをあなたが行ったように呼び出すだけです。より複雑なロジックの場合は、両方の場所で呼び出すことができます。次に、両方の場所に呼び出すことができる名前付き関数に配置します。 – jfriend00

答えて

18

代わりにsetTimeoutを使用して、コールバックのスケジュールを変更することができます。

$(function() { 
    sayHi(); 

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

setIntervalだけではないのはなぜですか? – user2019515

+0

@ user2019515 - 私は、OPがその機能の1回の呼び出しを望んでいることを理解しました。 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メソッドを使用することができます:あなたはそれが唯一の30秒後に一度実行したい場合

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

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

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

    heythere(); 

}); 

、あなたはsetTimeoutないsetIntervalを使用しようとしています。

3

まあ、おそらく...

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

別の解決策は、arguments.calleeをを使用することですが、それが廃止されると、それは一般的に推奨されていないだけで1回の呼び出しでそれを行う方法がありますこれを使って。

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