jQueryでイベントハンドラーを削除する最良の方法は?


1053

私は持っていinput type="image"ます。これは、Microsoft Excelのセルノートのように機能します。input-imageペアになっているテキストボックスに誰かが数値を入力した場合、のイベントハンドラーを設定しますinput-image。次に、ユーザーがをクリックするimageと、データにメモを追加するための小さなポップアップが表示されます。

私の問題は、ユーザーがテキストボックスにゼロを入力したときに、input-imageのイベントハンドラーを無効にする必要があることです。私は以下を試しましたが、役に立ちません。

$('#myimage').click(function { return false; });

回答:


1626

jQuery≥1.7

jQueryの1.7以降のイベントAPIが更新されていると、.bind()/ .unbind()後方互換性のためにまだ利用可能であるが、好ましい方法は、使用している上の() / オフ()関数を。以下は今、

$('#myimage').click(function() { return false; }); // Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');

jQuery <1.7

コード例では、前のイベントを上書きせずに、画像に別のクリックイベントを追加するだけです。

$('#myimage').click(function() { return false; }); // Adds another click event

両方のクリックイベントが発生します。

人々が言っ​​たように、バインド解除を使用してすべてのクリックイベントを削除できます。

$('#myimage').unbind('click');

単一のイベントを追加してから削除したい場合(追加された可能性のある他のイベントを削除せずに)、イベントの名前空間を使用できます。

$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });

イベントだけを削除するには:

$('#myimage').unbind('click.mynamespace');

6
unbind()が機能しているかどうかをテストする方法はありますか?追加しましたが、どちらのイベントもまだ発生しています。
David Yell

19
両方のイベントがまだ発生している場合は、明らかに機能していません。適切な答えを得るためには、より多くの情報を提供する必要があります。別の質問をしてみてください。
samjudson

13
古い回答-含まれている名前空間情報も同様ですが、忘れてしまいました。オン/オフはjQオブジェクトを返しますか?もしそうなら、恐らくより完全な答えはデイジーチェーンへのでしょう:$('#myimage').off('click').on('click',function(){...})
vol7ron

3
はい、そうです。そうです。他のすべてのクリックイベントをクリアしてから独自のクリックイベントを追加したい場合は、上記の連鎖呼び出しを実行できます。
samjudson 2013年

を使用し.unbind()て、一連のチェックボックスを切り替えていたのに役立ちましたが、.click()ハンドラーを繰り返し追加し直してアプリをハングさせたとのことです。
TecBrat

63

これは、この質問への回答時には利用できませんでしたが、live()メソッドを使用してイベントを有効または無効にすることもできます。

$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

このコードでは、#mydisablebuttonをクリックすると、#myimage要素に無効なクラスが追加されます。これにより、セレクターが要素と一致しなくなり、「無効」クラスが削除されて.live()セレクターが再び有効になるまでイベントが発生しなくなります。

これには、そのクラスに基づくスタイリングを追加することによる他の利点もあります。


3
使いやすい方法ですがlive()、これまでこのように使用することを考えたことはありません...コーディングの利便性は別として、それはより速いですか、それともbind / unbindを使用することに他の利点がありますか?
chakrit

2
要素を追加または削除する場合、liveとのバインディングが1回だけ行われるため、bindよりもパフォーマンスが確実に向上します。jQueryは特定の要素にバインドするのではなく、よりライブでデリゲートなイベントに移行しているようです。
MacAnthony、2010年

3
ライブを無効にするには、die()を使用できます
Moons

9
「jQuery 1.7以降、.live()メソッドは非推奨になりました。.on()を使用してイベントハンドラーをアタッチしてください。古いバージョンのjQueryのユーザーは、.live()よりも.delegate()を使用する必要があります。」 api.jquery.com/live
Lucas Pottersky

12
ああ、jQueryを気まぐれにして、ある日300人の担当者を1人の男性に連れて行き、翌日は陳腐化した。
MrBoJangles 2013

37

イベントに1回だけ応答したい場合は、次の構文が非常に役立ちます。

 $('.myLink').bind('click', function() {
   //do some things

   $(this).unbind('click', arguments.callee); //unbind *just this handler*
 });

arguments.calleeを使用すると、1つの特定の無名関数ハンドラーが確実に削除されるため、特定のイベントに対して単一のタイムハンドラーを持つことができます。これが他の人を助けることを願っています。


2
もちろん、場合によっては、ハンドラーをバインド解除するタイミングに関する特定のロジックが必要になることがあります(たとえば、最初にテキストボックスをファイルしない限り、バインドを解除しないでください)。
ghayes 2013年

5
arguments.calleeはstrictモードで廃止されました!
zloctb 2013年

37

これは、バインド解除機能を使用して行うことができます。

$('#myimage').unbind('click');

jqueryの同じオブジェクトとイベントに複数のイベントハンドラーを追加できます。つまり、新しいものを追加しても古いものは置き換えられません。

イベントネームスペースなど、イベントハンドラーを変更する方法はいくつかあります。これに関するいくつかのページがオンラインドキュメントにあります。

この質問を見てください(それが私がバインド解除について知った方法です)。回答には、これらの戦略の役立つ説明がいくつかあります。

jqueryでバインドされたホバーコールバック関数を読み取る方法



30

propとattrを使用して、イベントをnullに設定する必要がありました。どちらか一方ではできませんでした。また、.unbindを機能させることができませんでした。私はTD要素に取り組んでいます。

.prop("onclick", null).attr("onclick", null)

1
オンブラーを約30分間アンバインドしようとしたので、これに賛成票を投じました。'.unbind'は機能せず、 '。prop'は機能しませんでした。 '。attr'は機能しませんでした。奇数。私はjquery 1.7.2でChromeを使用しています
ジェレミー

こっちも一緒!単純な<a>タグからクリックイベントを削除しようとしました!これをありがとう。私の場合、.prop( "onclick"、null)で十分でした。
Jan Lobau、

こっちも一緒。バインド解除およびオフは、jq 1.7.2を使用するFFでは私にとって機能しませんでした。私の場合、.prop( "onclick"、null)でも十分
でした

4
上記の方法がうまくいかなかったのは、設定方法が原因だと思います。イベントハンドラーをDOMに書き込んだ場合、はい、イベントハンドラーをクリアするにはこの属性をクリアする必要がありますが、ほとんどの人(私を含む)はそのようなもの(javascrip、イベントハンドラーなど)を除外したいと考えていますDOMなので、イベントハンドラーをセットアップする場合$("#elementId").click(function(){//Event execution code goes here});は、htmlページにまったくないように使用します。実際にを使用する必要があることを明確にするため.unbind()、または推奨.off()
VoidKing 2013年

これは、jQueryを介して追加されたプロパティがChromeの要素パネルに表示されないことを発見するために1時間を費やしたばかりの人からのようなものです。試みunbindoff、それは問題を解決していませんでした。どうもありがとうございました!
レナン、2014年

13

イベントがこの方法でアタッチされ、ターゲットがアタッチ解除される場合:

$('#container').on('click','span',function(eo){
    alert(1);

    $(this).off(); //seams easy, but does not work

    $('#container').off('click','span'); //clears click event for every span

    $(this).on("click",function(){return false;}); //this works.

});​

11

onclickハンドラーをインラインマークアップとして追加している可能性があります。

<input id="addreport" type="button" value="Add New Report" onclick="openAdd()" />

その場合は、jqueryの.off().unbind()動作しません。元のイベントハンドラーをjqueryにも追加する必要があります。

$("#addreport").on("click", "", function (e) {
   openAdd();
});

次に、jqueryはイベントハンドラーへの参照を持ち、それを削除できます。

$("#addreport").off("click")

VoidKingは、上のコメントでこれをもう少し斜めに述べています。


9

2014年に更新

jQueryの最新バージョンを使用すると、次のようにするだけで、名前空間上のすべてのイベントをアンバインドできます $( "#foo" ).off( ".myNamespace" );


8

インラインonclickイベントを削除する最良の方法は $(element).prop('onclick', null);


8

remove ALL event-handlers、これは私のために働いていたものです:

すべてのイベントハンドラーを削除するということは、とそのにアタッチされていHTML structureないプレーンが存在することを意味します。これを行うには、助けました。event handlerselementchild nodesjQuery's clone()

var original, clone;
// element with id my-div and its child nodes have some event-handlers
original = $('#my-div');
clone = original.clone();
//
original.replaceWith(clone);

これcloneで、original何もないの代わりevent-handlersになります。

幸運を...


7

情報のおかげで。他のユーザーによる編集モードでのページ操作のロックに使用しました。ajaxCompleteと組み合わせて使用​​しました。必ずしも同じ動作ではありませんが、多少似ています。

function userPageLock(){
    $("body").bind("ajaxComplete.lockpage", function(){
        $("body").unbind("ajaxComplete.lockpage");
        executePageLock();      
    });
};  

function executePageLock(){
    //do something
}

5

場合に.on()この方法は、以前は次の例のように、特定のセレクタで使用しました:

$('body').on('click', '.dynamicTarget', function () {
    // Code goes here
});

unbind().off()メソッドどちらも

ただし、.undelegate()メソッドを使用して、現在のセレクターに一致するすべての要素のイベントからハンドラーを完全に削除できます。

$("body").undelegate(".dynamicTarget", "click")

1
この解決策を探している間、私はページ全体をスクロールしました。
Abhishek Pandey

4

を使用$(document).on()して動的に作成された要素にリスナーを追加する場合、次のものを使用して削除する必要がある場合があります。

// add the listener
$(document).on('click','.element',function(){
    // stuff
});

// remove the listener
$(document).off("click", ".element");

3

これもうまく機能します。シンプルで簡単です。http //jsfiddle.net/uZc8w/570/を参照してください

$('#myimage').removeAttr("click");

2

あなたがonclick経由で設定した場合、あなたはhtmlする必要がありますremoveAttr ($(this).removeAttr('onclick'))

あなたがjqueryを介してそれを設定した場合(上記の私の例の最初のクリックの後)、次にする必要があります unbind($(this).unbind('click'))


2

私はこれが遅いことだと知っていますが、イベントを削除するためにプレーンJSを使用しないのはなぜですか?

var myElement = document.getElementById("your_ID");
myElement.onclick = null;

または、名前付き関数をイベントハンドラーとして使用する場合:

function eh(event){...}
var myElement = document.getElementById("your_ID");
myElement.addEventListener("click",eh); // add event handler
myElement.removeEventListener("click",eh); //remove it

良い提案です。可能な場合はネイティブJavaScriptを使用することをお勧めします
Michiel

1

on()要素が実行時に作成されたドキュメントにクリックイベントを追加していたため、説明されているすべてのアプローチが機能しませんでした。

$(document).on("click", ".button", function() {
    doSomething();
});


私の回避策:

「.button」クラスをアンバインドできなかったので、同じCSSスタイルを持つボタンに別のクラスを割り当てました。そうすることで、live / on-event-handlerは最終的にクリックを無視しました:

// prevent another click on the button by assigning another class
$(".button").attr("class","buttonOff");

お役に立てば幸いです。


1

私の下のコードがすべてを説明することを願っています。HTML:

(function($){

     $("#btn_add").on("click",function(){
       $("#btn_click").on("click",added_handler);
       alert("Added new handler to button 1");
     });

  
 
     $("#btn_remove").on("click",function(){
       $("#btn_click").off("click",added_handler);
       alert("Removed new handler to button 1");
     });

  
   function fixed_handler(){
    alert("Fixed handler");
  }
  
   function added_handler(){
    alert("new handler");
  }
  
  $("#btn_click").on("click",fixed_handler);
  $("#btn_fixed").on("click",fixed_handler);
  
  
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn_click">Button 1</button>
  <button id="btn_add">Add Handler</button>
  <button id="btn_remove">Remove Handler</button>
  <button id="btn_fixed">Fixed Handler</button>


1
なぜあなたはで渡している })(jQuery);ことはすでにグローバルにアクセスすることができたときに生命維持に?
ブライアンP

2
良い質問ブライアン。この方法は、実際に私の遺伝子に取り入れられました。-jquery以外のプラグインが変数$を持つ可能性があるため、$を直接使用することはできません。-jsスクリプトファイルで「jQuery」という単語を頻繁に使用すると、ファイルのバイトサイズが大きくなる可能性があります。jQueryは6バイトの文字列です。したがって、「$」または1バイトの変数を使用することを好みます。
mysticmo 2016年

0

それをボタンから削除するだけです:

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