2012-04-17 5 views
0

私はjQueryの本を読んでいて、例をしようとしています。この例では、画面上で稲妻が点滅し、その部分は正常に動作します。問題は、タブを切り替えてからスイッチバックすると、雷が連続して点滅し始めるということです。この問題はwindow.onblurとwindow.onfocusイベントを使って修正されるはずですが、動作しません。誰か私が間違っていることを見ることができますか?Javascript/jQueryがClearIntervalを動作させるように見えない

異なるIDを持つ3つの隠し雷画像と、それぞれをフラッシュする3つの異なる機能があります。 goLightning()は各関数の間隔を設定し、stopLightning()はその間隔をクリアする必要があります。その部分は私が知っているすべてのために働いていないようです。コードは次のとおりです。

$(document).ready(function(){ 
    goLightning(); 
    window.onblur = stopLightning; 
    window.onfocus = goLightning; 
    var int1; var int2; var int3; 

    // this function sets the lightning interval 
    function goLightning() { 
     int1 = setInterval(function() { lightning_one(); },4000); 
     int2 = setInterval(function() { lightning_two(); },5000); 
     int3 = setInterval(function() { lightning_three(); },7000); 
    } 

    // this function clears the lightning when the window isn't focused 
    function stopLightning() { 
     window.clearInterval(int1); 
     window.clearInterval(int2); 
     window.clearInterval(int3); 
    } 

    // these three functions make the lightning flash and seem to be working fine 
    function lightning_one() { 
      $("#container #lightning1").fadeIn(250).fadeOut(250); 
    } 
    function lightning_two() { 
     $("#container #lightning2").fadeIn(250).fadeOut(250); 
    } 
    function lightning_three() { 
     $("#container #lightning3").fadeIn(250).fadeOut(250); 
    } 
}); 

これがなぜ機能しないのかわかりません。 stopLightning()が間隔をクリアしていないか、window.onblurが機能していないようです。とにかく、どんなフィードバックも役に立ちます。ありがとう!

+0

簡単な質問は、動作しているかどうかを確認する唯一の方法が表示されない場合はどうしたらよいですか? –

+0

私はタブを前後に切り替えてテストしていたのと同じように動作しているかどうかを確認していました。私はいつものようにアラートを使ってみましたが、うまくいきませんでした:) –

答えて

4

新しい間隔を設定する前に、stopLightning()を先頭からgoLightning()に追加してください。

+0

ありがとう!魅力のように働いた。私はまだそれが必要な理由はまだ分かりませんが、私は今それと一緒に行くでしょう! –

1

次の行の再手配:、

var int1, int2, int3, w = window; 
w.onblur = stopLightning; 
w.onfocus = goLightning; 
goLightning(); 

次あなたがへの参照を使用し確実にするためにstopLightning()機能に代わりwindowの変数wを使用します。代わりに、これにで

goLightning(); 
window.onblur = stopLightning; 
window.onfocus = goLightning; 
var int1; var int2; var int3; 

を適切なウィンドウ。また、@Kolinkが述べたように、goLightning()関数の冒頭にstopLightning()を呼び出すと、フォーカスイベントが2回以上発生した場合に複数のインスタンスが実行されないようにすることができます。

EDIT私はイベントをセットアップした後にgoLightning()に電話を移動しましたが、それはより良い方法でしょうか?

+0

私はあなたの並べ替えを試みたが、まだ問題があった。 goLightningの初めにstopLightningを追加すると、 –

関連する問題