jQueryを使用してすべてのクリックイベントハンドラーを削除する方法


121

問題があります。基本的に、ユーザーがページの「編集」リンクをクリックすると、次のJqueryコードが実行されます。

$("#saveBtn").click(function () {
    saveQuestion(id);
});

これにより、保存ボタンのonClickイベントがsaveQuestion()メソッドを呼び出し、「編集」リンクがクリックされた質問のIDを渡します。

ただし、同じセッションでユーザーが2つの質問の[編集]をクリックすると、前のclickイベントハンドラーを上書きする代わりに、2つのイベントハンドラーが実行され saveQuestion(1)ますsaveQuestion(2)。これを行うことにより、1つの質問が他の質問を上書きします。

clickボタンに割り当てられている以前のイベントをすべて削除する方法はありますか?

回答:


202

次のようにイベントを削除するには、off()を使用ます。

$("#saveBtn").off("click");

ただし、これにより、この要素にバインドされているすべてのクリックイベントが削除されます。SaveQuestionを持つ関数がバインドされた唯一のイベントである場合、上記はそれを行います。そうでない場合は、以下を実行します。

$("#saveBtn").off("click").click(function() { saveQuestion(id); });

31
jQuery 1.7以降、バインドとバインド解除の代わりにオンとオフを使用する必要があります
Ralph Jansen

@LockTarでは、代わりにこれをどのように記述するかを提案できますか?
John Magnolia

@JohnMagnolia上記の私の変更を参照してください。
Ralph Jansen、

1
.addAttr( 'onclick'); または.removeAttr( 'onclick');
Aliti 2016

13

ボタンに割り当てられている以前のすべてのクリックイベントを削除する方法はありますか?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});

unbind()jQuery 3.0の時点で非推奨になりoff()、1.7からの使用が推奨されています。
Skylar Ittner

7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});

2

使用した場合...

$(function(){
    function myFunc() {
        // ... do something ...
    };
    $('#saveBtn').click(myFunc);
});

...後でバインドを解除する方が簡単です。


1
どのように考えますか?要素のイベントがどのようにバインドされていても、常に同じ方法でバインドを解除できます... $( '#saveBtn')。unbind( 'whatever event(s)'); さて、RE-BINDするために...はい、特定の状況ではあなたのテクニックはより簡単かもしれません。
KyleFarris、2009

1
すべてのクリックイベントのバインドを解除しても、違いはありません。ただし、特定のアクションを1つだけバインド解除したい場合は、そのイベントを2か所で書き直したくありません。そして、あなたが言ったように、後でそれを再バインドしたい場合は、関数を3回記述する必要がないので、それは再びより簡単です。
Jarrett Meyer、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.