2

「One」を使用してクリックハンドラーを接続しています。

Jquery の「1 つの」メソッドは、イベント ハンドラーを接続し、最初の呼び出しの後に切り離しますが、十分に速くクリックすると、複数のイベント ハンドラーがキューに入れられ、コールバックが複数回実行される可能性があります。

元:

$("#button").one("click", function () {

            //run logic

});

この動作を防ぐにはどうすればよいですか。「One」は、最初に実行した後にハンドラーをデタッチすると想定していますが、コールバックの実行中にボタンをクリックすると、2 回目に実行されると想定するのは合理的ですか?

4

1 に答える 1

4

「One」は、最初に実行した後にハンドラーをデタッチすると想定しています

true ではありません.one。ハンドラー関数を実行する前にイベント ハンドラーをデタッチします。.oneソース コードを見ると.off、ハンドラー関数が呼び出される前に がトリガーされます。

if (one === 1) {
    origFn = fn;
    fn = function (event) {
        jQuery().off(event);  //Your event is unregistered here
        return origFn.apply(this, arguments); //Your handler is called
    };
    fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
}

フレデリック・ハミディがコメントで指摘したように、

ハンドラーが実行中にイベントを再トリガーした場合でも、新しいイベントの実際の処理は、現在のハンドラーが戻り、元のイベントが完全に解決されるまで発生しません (イベントがバブルアップすることが許可されている場合は、他のハンドラーが関与する可能性があります)。 DOM ツリー)。その時までに、ハンドラーはどちらの場合も削除されます。

証明: http://jsfiddle.net/skram/abcvW/2/

于 2012-06-11T19:02:38.157 に答える