私はinput type="image"
を持っています。これは、Microsoft Excelのセルノートのように機能します。誰かがこのinput-image
とペアになっている番号をテキストボックスに入力した場合、私はinput-image
のためのイベントハンドラを設定します。次に、ユーザーがimage
をクリックすると、データにメモを追加するための小さなポップアップが表示されます。
私の問題は、ユーザーがテキストボックスにゼロを入力したとき、私はinput-image
のイベントハンドラを無効にする必要があるということです。私は以下を試しましたが、役に立ちませんでした。
$('#myimage').click(function { return false; });
JQuery 1.7以降ではイベントAPIが更新されました。下位互換性のために.bind()
/.unbind()
がまだ利用可能ですが、推奨される方法は on() / off() 関数を使用することです。以下は今でしょう、
$('#myimage').click(function() { return false; }); // Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');
サンプルコードでは、前のイベントをオーバーライドするのではなく、単にクリックイベントを画像に追加するだけです。
$('#myimage').click(function() { return false; }); // Adds another click event
両方のクリックイベントが発生します。
人々が言ったようにあなたはすべてのクリックイベントを削除するためにunbindを使うことができます:
$('#myimage').unbind('click');
単一のイベントを追加してから削除する(追加された可能性のある他のイベントを削除せずに)場合は、イベントの名前空間を使用できます。
$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });
自分の予定だけを削除するには:
$('#myimage').unbind('click.mynamespace');
この質問に答えたときには利用できませんでしたが、 live() メソッドを使ってイベントを有効/無効にすることもできます。
$('#myimage:not(.disabled)').live('click', myclickevent);
$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });
このコードで起こることはあなたが#mydisablebuttonをクリックするとき、それは無効にされたクラスを#myimage要素に追加するということです。これにより、セレクタは要素と一致しなくなり、 'disabled'クラスが削除されて.live()セレクタが再度有効になるまでイベントは発生しません。
これには、そのクラスに基づいてスタイルを追加することによるその他の利点があります。
これはunbind関数を使って行うことができます。
$('#myimage').unbind('click');
Jqueryの同じオブジェクトとイベントに複数のイベントハンドラを追加できます。これは、新しいものを追加しても古いものが置き換えられないことを意味します。
イベントの名前空間など、イベントハンドラを変更するための戦略はいくつかあります。これに関するいくつかのページがオンラインドキュメントにあります。
この質問を見てください(それが私がアンバインドを知った方法です)。答えにこれらの戦略のいくつかの有用な説明があります。
イベントたった1回に応答したい場合は、次の構文が非常に役立ちます。
$('.myLink').bind('click', function() {
//do some things
$(this).unbind('click', arguments.callee); //unbind *just this handler*
});
arguments.callee _を使用することで、特定の無名関数ハンドラを確実に削除することができます。したがって、特定のイベントに対して単一の時間ハンドラを使用することができます。これが他の人に役立つことを願っています。
多分unbindメソッドはあなたのために働くでしょう
$("#myimage").unbind("click");
Propとattrを使ってイベントをnullに設定しなければなりませんでした。どちらにもできませんでした。私は.unbindを動かすこともできませんでした。私はTD要素に取り組んでいます。
.prop("onclick", null).attr("onclick", null)
イベントが添付されている場合 このように で、ターゲットは接続されていません。
$('#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.
});
インラインマークアップとして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はこれをもう少し斜めに上のコメントで述べています。
2014用に更新
最新バージョンのjQueryを使用すると、$( "#foo" ).off( ".myNamespace" );
を実行するだけで名前空間のすべてのイベントをバインド解除できます。
インラインonclickイベントを削除する最善の方法は$(element).prop('onclick', null);
です
情報のおかげで。非常に便利私は編集モードで他のユーザーがページのインタラクションをロックするのに使っていました。私はajaxCompleteと一緒にそれを使用しました。必ずしも同じ動作ではありませんが、多少似ています。
function userPageLock(){
$("body").bind("ajaxComplete.lockpage", function(){
$("body").unbind("ajaxComplete.lockpage");
executePageLock();
});
};
function executePageLock(){
//do something
}
remove
_ all _ event-handlers
にとって、これは私にとってうまくいったことです:
すべてのイベントハンドラを削除するということは、すべてのHTML structure
をelement
とそのevent handlers
に結び付けずに、単純なchild nodes
を持つことを意味します。これを行うために、jQuery'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
はありません。
がんばろう...
次の例のように、.on()
メソッドが以前に特定のセレクタで使用された場合
$('body').on('click', '.dynamicTarget', function () {
// Code goes here
});
unbind()
メソッドと.off()
メソッド はどちらも ではありません。
ただし、 .undelegate() メソッドを使用して、現在のセレクタに一致するすべての要素のイベントからハンドラを完全に削除できます。
$("body").undelegate(".dynamicTarget", "click")
これもうまく動作します。簡単で簡単。 http://jsfiddle.net/uZc8w/570/
$('#myimage').removeAttr("click");
onclick
を介してhtml
を設定する場合は、removeAttr ($(this).removeAttr('onclick'))
を実行する必要があります。
jqueryで設定した場合(上の例では最初のクリックの後のように)、unbind($(this).unbind('click'))
を実行する必要があります。
私はこれが遅くなったことを知っていますが、なぜイベントを削除するためにプレーンな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
私の下のコードがすべてを説明することを願っています。 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>
実行時に要素が作成されたドキュメントにon()
付きのclickイベントを追加していたので、説明したすべてのアプローチは私にはうまくいきませんでした。
$(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");
それが役立つことを願っています。
動的に作成された要素にリスナを追加するために$(document).on()
を使用するなら、それを削除するために以下を使用しなければならないかもしれません:
// add the listener
$(document).on('click','.element',function(){
// stuff
});
// remove the listener
$(document).off("click", ".element");