2016-05-09 8 views
0

こんにちは私はautoswitch = true関数を呼び出すときにsetIntervalを呼び出し、autoswitchの値をfalseに設定します。これは再び動作しないclearIntervalを呼び出します。clearIntervalが機能しません

あなたはその関数にローカル変数としてsetIntrを定義しているので、それがある

$(document).ready(function() { 
    var speed = 500; 
    var autoswitch = true; 
    var autoswitch_speed = 4000; 

    //add active class 
    $('.slide').first().addClass('active'); 

    //hide slides 
    $('.slide').hide(); 

    //show first slide 
    $('.active').show(); 

    // Click next to show next slide 
    $('#next').click(function() { 
    nextSlide(); 
    }); 

    //Onclick go to prev slide 
    $('#prev').click(function() { 
    prevSlide(); 
    }); 

    //play auto slide show 
    $('#playBtn').click(function() { 
    if (autoswitch === true) { 
     var setIntr = setInterval(nextSlide, autoswitch_speed); 
     autoswitch = false; 
    } else { 
     clearInterval(setIntr); 
     autoswitch = true; 
    } 
    }); 

    // next slide function 
    function nextSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 

    // Prev slide function   
    function prevSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 
}); 
+1

: "setIntr" グローバルdocument.ready

でその後、以下のコードを使用し

宣言'if'ステートメントによって束縛されます。 'else'文でも変数をpublicにしてください。 – Bhumika107

+1

'else 'ブロックにアクセスできないように' if'ブロックに宣言しているので、 'setIntr'をグローバルスコープ – se0kjun

+0

に移動するとうまくいくと思います。\ – Gomzy

答えて

0

いくつかの助けを必要としています。範囲外になり、再び呼び出されると、その間隔でハンドルがなくなります。範囲外のvarをどこかで定義する必要があります。私はそれがグローバルになるだろうが、私はあなたがクリック機能のsetIntr外を宣言する必要がより良い方法

3

があるかもしれないと確信しています。 準備完了機能の上部に設定することができます。

私が行って、ここにコードを修正した:https://snippetbox.xyz/9eb54a2a1f52dc1f5d40/

$(document).ready(function() { 
    var speed = 500; 
    var autoswitch = true; 
    var autoswitch_speed = 4000; 
    var setIntr; 

    //add active class 
    $('.slide').first().addClass('active'); 

    //hide slides 
    $('.slide').hide(); 

    //show first slide 
    $('.active').show(); 

    // Click next to show next slide 
    $('#next').click(function() { 
    nextSlide(); 
    }); 

    //Onclick go to prev slide 
    $('#prev').click(function() { 
    prevSlide(); 
    }); 

    //play auto slide show 
    $('#playBtn').click(function() { 
    if (autoswitch === true) { 
     setIntr = setInterval(nextSlide, autoswitch_speed); 
     autoswitch = false; 
    } else { 
     clearInterval(setIntr); 
     autoswitch = true; 
    } 
    }); 

    // next slide function 
    function nextSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 

    // Prev slide function   
    function prevSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 
}); 
-1

あなただけの「setIntr」アウトサイドを変数に追加する必要があるかの条件として、以下のように:あなたのよう

$('#playBtn').click(function() { 
    var setIntr; 
    if (autoswitch === true) { 
    setIntr = setInterval(nextSlide, autoswitch_speed); 
    autoswitch = false; 
    } else { 
    clearInterval(setIntr); 
    autoswitch = true; 
    } 
    }); 

他の場合にアクセスできないIf条件で "setIntr"を宣言しました。そうすれば、他にも使用したい場合はifまたはグローバルに宣言する必要があります。

EDITED: 値を1つの条件に設定し、他にチェックインしようとしています。この場合、グローバル変数として "setIntr"を宣言する必要があります。

ので、作業コードは次のようにする必要があります: `VARのsetIntr`がある

$('#playBtn').click(function() { 
if (autoswitch === true) { 
    setIntr = setInterval(nextSlide, autoswitch_speed); 
    autoswitch = false; 
} else { 
    clearInterval(setIntr); 
    autoswitch = true; 
} 
}); 
+0

「あなたが宣言したとおりに」という説明は、「elseでアクセスできない条件」のsetIntrを間違っています。 'var'は関数全体の変数を宣言します。 [MDN:var hoisting](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/var#var_hoisting) –

+0

@ t.niese、あなたが質問をチェックすると、私は何を得るのですか?ここで私は最初の答えを投稿します。私は彼がvaribaleを宣言していたことを質問者に確認してもらいたいと思っています。 –

+0

働いて、すばらしいおかげでたくさん。 – Spark

関連する問題