1

フィドルで2つのフェーズがシフトしないのはなぜですか: http://jsfiddle.net/WH7Kf/43/

function phase_switch(){
    var phase;
    clicker = document.getElementById("click");
    phase=1
    switch (phase) {
        case 1:
            clicker.onclick = do_this;
            break;
        case 2:
            clicker.onclick = do_that;
            break;
    }

    function do_this (){
        alert("this");
        phase==2;
    }
    function do_that (){
        alert("that");
        phase==1;
    }
}

window.addEventListener("load", phase_switch());

おそらくおわかりのように、フェーズ 1 は発火している唯一のフェーズです。フェーズ 2 が起動しないのはなぜですか?

4

3 に答える 3

2

最初から、いくつかの構文の問題があります。

1) フィドルはすでに JavaScript コードを実行するように設定されていますonLoad。サイドバーでさまざまなオプションを確認してください。

2) 変数宣言がありません。変数を省略するvarと、グローバルになり、関数の外部からアクセスできるようになります。あなたはこれを望んでいません。

3)=は代入、==平等、===厳密な平等です。詳細については、MDN を検索してください

4) あなたは物事を複雑にしすぎていると思います。懸念事項を分離するようにしてください。要素とメッセージを受け取る関数を作成し、イベント ハンドラー内でロジックを実行します。フラグを追跡して、配列に格納された 2 つの異なるメッセージを切り替えることができます。例えば:

var clicker = document.getElementById("click");

/**
 * @param el DOM element
 * @param msgs Array containing 2 messages
 */
function phaseSwitch(el, msgs) {
    var flag = false;
    el.addEventListener('click', function() {
        alert(msgs[+flag]); // casts flag to index (0|1)
        flag = !flag; // invert flag
    });
}

phaseSwitch(clicker, ['hello', 'bye']);

デモ: http://jsfiddle.net/WH7Kf/48/

于 2014-05-06T04:43:08.490 に答える
2

もっと簡単にできます:

var clicker = document.getElementById("click");
clicker.onclick = do_this;
function do_this (){
    alert("this");
    clicker.onclick = do_that;
}
function do_that (){
    alert("that");
    clicker.onclick = do_this;
}

http://jsfiddle.net/Ncz7w/

于 2014-05-06T04:40:02.137 に答える
0

ウィンドウ ロード イベントはページのライフ サイクルで 1 回発生します。一度実行されるウィンドウ ロード イベントでクリック ハンドラをバインドします。そのためphase、最初は値が 1 になるため、ボタンをクリックdo_thisすると常に実行されます

于 2014-05-06T04:34:05.673 に答える