2

1-私はこの単純なhtmlボタンを持っています:

<input type="button" id="testBtn" value="1" />

2-そしていくつかのjquery:

function one()
{
    $("#testBtn").val("1")
    .click(function(){
        zero();
    });         
}

function zero()
{
    $("#testBtn").val("0")
    .click(function(){
        one();
    });
}
$(document).ready(function(){
    $("#testBtn").click(function(){
        zero();
    });
});

3-testBtnを複数回クリックすると、Firefoxに次のメッセージが表示されます。

A script on this page may be busy, or it may have stopped responding. You can stop script now, or you can continue to see if the script will complete. Script: http://localhost/js/jquery-1.7.2.min.js:2

[続行]をクリックすると、Firefoxは上記のメッセージを再度表示します。

4-代わりに次の解決策を使用し、応答しないダイアログを解決することができました:

var state=1;

function onezero()
{
    if (state == 1)
    {
        $("#testBtn").val("0")
        .click(function(){
            one();
        });
    }
    else
    {
        $("#testBtn").val("0")
        .click(function(){
            one();
        });     
    }
}

$(document).ready(function(){
    $("#testBtn").click(function(){
        onezero();
    });
});

5-以上のソリューションはうまく機能しますが、最初のソリューションがjqueryを強制終了するのはなぜですか?

4

4 に答える 4

3

最初のソリューションは、ボタンをクリックするたびに新しいイベントハンドラーをアタッチします。あなたは実際にこれでより良いでしょう:

document.getElementById('testBtn').onclick = function() {
    this.value = this.value == 1 ? 0 : 1;
};
于 2012-08-17T19:43:08.283 に答える
2

http://jsfiddle.net/YFUuR/

コンソールを開いて見てみましょう。ボタンをクリックし続けると、コンソールにますます多くのイベントハンドラーがアタッチされ続けます。最終的には、すべてがうまくいきます。

于 2012-08-17T19:43:15.623 に答える
1

毎回クリックイベントを追加し続けるからです。click()は前のイベントを上書きしません。

    $("#testBtn").val("0")
    .off("click").on("click", function(){
        one();
    }); 

悪い点offは、その要素に関連付けられている可能性のある他のクリックイベントをすべて消去することです。それは悪いことです。より良いアプローチは、ワンクリックハンドラーを追加し、それにロジックを組み込んで何をするかです。

    $("#testBtn").data("state",false).val("0")
    .on("click", function(){
        var elem = $(this);
        var state = elem.data("state");
        if(state) {
            one();
        } else {
            two();
        }
        elem.data("state", !state);
    }); 
于 2012-08-17T20:14:00.563 に答える
0

参照のために不要なイベントハンドラーを追加して、要素をオーバーロードしていました。

于 2012-08-17T19:42:40.797 に答える