setTimeoutをリセットするためにclearTimeoutを2回呼び出す必要があるのはなぜですか

dcufo

このチュートリアルに従ってJavaScriptで回転バナーを作成しようとしたときに、パズルに遭遇しました

すべての画像は、で一定の間隔で表示されましたsetTimeout後で、ユーザーがバナーの次の画像に手動で切り替えることができるボタンを追加したいので、clearTimeout最初に自動切り替えのタイマーを停止し、手動切り替え後にリセットするために使用すると思いました。しかし、元のタイマーをリセットする前に適切停止するために、2回呼び出す必要がclearTimeoutあるという事実に混乱しましたclearTimeout一度呼び出すと、タイマーを正しく停止できませんでした。誰かが私にそのようなケースがある理由を説明するのを手伝ってもらえますか?私のコードに何か問題がありますか?以下はコードの一部です:

//Global Variables
var switchTimeout;
myBanner = new Array("img/chicken.jpg", "img/tiger.jpg", "img/pig.jpg");
var bannerCounter = 0;

//Called after the page is loaded
function switchBanner() {
  if (document.images) {
    bannerCounter++;
    if (bannerCounter == myBanner.length) {
      bannerCounter = 0;
    }
    document.getElementById("banner").src = myBanner[bannerCounter];
    switchTimeout = setTimeout("switchBanner()",3000);
  }
}

//Called when user hits the button
function manualSwitch() {
  //Why do I need to call this twice for it to work?
  clearTimeout(switchTimeout);
  clearTimeout(switchTimeout);
  if (document.images) {
    bannerCounter++;
    console.log(bannerCounter);
    if (bannerCounter == myBanner.length) {
      bannerCounter = 0;
    }
    document.getElementById("banner").src = myBanner[bannerCounter];
    //Reset the timer now
    switchTimeout = setTimeout("switchBanner()",3000); 
  }
}

ご協力いただき誠にありがとうございます!

J.ガルシア

私はこれをテストしましたが、1回だけ呼び出すだけで問題なく動作するようですが、これはのsetInterval()代わりに使用する方が適しているようですsetTimeout()また、不要なコードの繰り返しを減らします。

img'sを置き換える代わりにテキストのみを使用する例を参照してくださいsource

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="banner"> </div>
    <button onclick="changeAndTriggerInterval()" id="bannerSwitcher">Switch Banner</button>
    <script>
        let intervalIdentifier = 0;
        let  bannerCounter = 0;
        myBanner = new Array("img/chicken.jpg", "img/tiger.jpg", "img/pig.jpg");
        // Called when user hits the button and on initial page load
        function changeAndTriggerInterval() {
            changeBanner();
            resetBannerChanger();
        }

        function resetBannerChanger() {
            if (intervalIdentifier > 0) {
                clearInterval(intervalIdentifier);
            }
            intervalIdentifier = setInterval(changeBanner, 3000);
        }

        function changeBanner() {
            // Change before updating counter to start from index 0
            document.getElementById("banner").innerText = myBanner[bannerCounter];
            bannerCounter++;
            if (bannerCounter == myBanner.length) {
                bannerCounter = 0;
            }
        }
        window.onload = changeAndTriggerInterval;
    </script>

</body>

</html>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

angle8とjqueryでonclickイベントをトリガーするために2回クリックする必要があるのはなぜですか

分類Dev

期待される結果を得るために、push()JS関数を呼び出して()これをリセットする必要があるのはなぜですか?

分類Dev

イベントを開催するためにボタンを2回クリックする必要があるのはなぜですか?

分類Dev

inotify_add_watch()でread()を2回呼び出す必要があるのはなぜですか

分類Dev

範囲で `find`を呼び出すために、範囲をミュートする必要があるのはなぜですか?

分類Dev

ES6 プロミスをテストするために、promise.then() を自分で呼び出す必要があるのはなぜですか?

分類Dev

BeanListProcessorと組み合わせてparseLineを2回呼び出す必要があるのはなぜですか

分類Dev

イベントを反応させるために2回クリックする必要があるのはなぜですか?

分類Dev

メニューを開いたり閉じたりするために2回クリックする必要があるのはなぜですか

分類Dev

jQuery Validateを使用して送信するためにフォームを2回クリックする必要があるのはなぜですか?

分類Dev

JavaScript:colorActiveLine関数を実行するためにテーブルを2回クリックする必要があるのはなぜですか?

分類Dev

'reverse'反復に進むことができるように、ListIteratorでprevious()を2回呼び出す必要があるのはなぜですか?

分類Dev

Rails-jQuery jQueryの効果を表示するために2回クリックする必要があるのはなぜですか?

分類Dev

この場合、画像をロードするために2回クリックする必要があるのはなぜですか?

分類Dev

期待どおりに機能するためにSIGINTを2回トリガーする必要があるのはなぜですか?

分類Dev

大文字の文字列を作成するために、呼び出し可能文字をre.subに渡す必要があるのはなぜですか?

分類Dev

なぜresolve()を呼び出す必要があるのですか?

分類Dev

javascript:表示プロパティを変更するために2回クリックする必要があるのはなぜですか?

分類Dev

動作するためにボタンを2回クリックする必要があるのはなぜですか

分類Dev

機能を実行するために2回クリックする必要があるのはなぜですか?

分類Dev

要素0を表示するために2回押す必要があるのはなぜですか?

分類Dev

Read :: read_to_stringを呼び出すためにファイルを変更可能にする必要があるのはなぜですか?

分類Dev

Foreach-Objectコマンドレットを実行するためにEnterキーを2回押す必要があるのはなぜですか?

分類Dev

このJavaScript関数を機能させるために2回クリックする必要があるのはなぜですか?

分類Dev

送信ボタンは、Reactで関数を呼び出すために2回クリックする必要があります

分類Dev

invokeAllメソッドの後にjoinを呼び出す必要があるのはなぜですか?

分類Dev

パイプに関係する呼び出されたバッチスクリプトから `call`を返す必要がないのはなぜですか?

分類Dev

ユーザー入力を受け入れるために、syscallreadの前にsyscallwriteを呼び出す必要があるのはなぜですか?

分類Dev

パッチをすべて削除するために、matplotlib軸からパッチを2回削除する必要があるのはなぜですか?

Related 関連記事

  1. 1

    angle8とjqueryでonclickイベントをトリガーするために2回クリックする必要があるのはなぜですか

  2. 2

    期待される結果を得るために、push()JS関数を呼び出して()これをリセットする必要があるのはなぜですか?

  3. 3

    イベントを開催するためにボタンを2回クリックする必要があるのはなぜですか?

  4. 4

    inotify_add_watch()でread()を2回呼び出す必要があるのはなぜですか

  5. 5

    範囲で `find`を呼び出すために、範囲をミュートする必要があるのはなぜですか?

  6. 6

    ES6 プロミスをテストするために、promise.then() を自分で呼び出す必要があるのはなぜですか?

  7. 7

    BeanListProcessorと組み合わせてparseLineを2回呼び出す必要があるのはなぜですか

  8. 8

    イベントを反応させるために2回クリックする必要があるのはなぜですか?

  9. 9

    メニューを開いたり閉じたりするために2回クリックする必要があるのはなぜですか

  10. 10

    jQuery Validateを使用して送信するためにフォームを2回クリックする必要があるのはなぜですか?

  11. 11

    JavaScript:colorActiveLine関数を実行するためにテーブルを2回クリックする必要があるのはなぜですか?

  12. 12

    'reverse'反復に進むことができるように、ListIteratorでprevious()を2回呼び出す必要があるのはなぜですか?

  13. 13

    Rails-jQuery jQueryの効果を表示するために2回クリックする必要があるのはなぜですか?

  14. 14

    この場合、画像をロードするために2回クリックする必要があるのはなぜですか?

  15. 15

    期待どおりに機能するためにSIGINTを2回トリガーする必要があるのはなぜですか?

  16. 16

    大文字の文字列を作成するために、呼び出し可能文字をre.subに渡す必要があるのはなぜですか?

  17. 17

    なぜresolve()を呼び出す必要があるのですか?

  18. 18

    javascript:表示プロパティを変更するために2回クリックする必要があるのはなぜですか?

  19. 19

    動作するためにボタンを2回クリックする必要があるのはなぜですか

  20. 20

    機能を実行するために2回クリックする必要があるのはなぜですか?

  21. 21

    要素0を表示するために2回押す必要があるのはなぜですか?

  22. 22

    Read :: read_to_stringを呼び出すためにファイルを変更可能にする必要があるのはなぜですか?

  23. 23

    Foreach-Objectコマンドレットを実行するためにEnterキーを2回押す必要があるのはなぜですか?

  24. 24

    このJavaScript関数を機能させるために2回クリックする必要があるのはなぜですか?

  25. 25

    送信ボタンは、Reactで関数を呼び出すために2回クリックする必要があります

  26. 26

    invokeAllメソッドの後にjoinを呼び出す必要があるのはなぜですか?

  27. 27

    パイプに関係する呼び出されたバッチスクリプトから `call`を返す必要がないのはなぜですか?

  28. 28

    ユーザー入力を受け入れるために、syscallreadの前にsyscallwriteを呼び出す必要があるのはなぜですか?

  29. 29

    パッチをすべて削除するために、matplotlib軸からパッチを2回削除する必要があるのはなぜですか?

ホットタグ

アーカイブ