だから私は短いだろう:jquery .off()
私が "とセットしたリスニングを無効にしない .on
.
html:
<span id="myspan">lol</span>
<button id="b1">jquery On</button>
<button id="b2">jquery Off</button>
js:
$("#b1").on("click", add);
$("#b2").on("click", del);
function add() {
$("#myspan").on("click", function(e) {
var a = 1;
testfunc(a, e);
});
}
function del() {
$("#myspan").off("click", testfunc);
}
function testfunc(num, event) {
alert(num);
}
まずは マスパン その testfunc()
をクリックすると jquery On ボタン。スパンをクリックすると警告が表示されます。次に、 jquery off ボタン。それはリスナーを削除するはずですが、それでも、 マスパン testfunc
まだ添付されています。
どうして?どうすれば削除できますか?
回答:
回答№1は14あなたのパラメータは一致しません
あなたが別の関数(匿名のもの)にバインドしているので、それはできません。そして、あなたは testfunc
...あなたのイベント(un)が働くためには 両方のパラメータの間 on
そして off
一致している必要があります.
考えられる回避策
これが唯一の場合 click
要素のイベントリスナーを呼び出すと、呼び出すことによって無名関数からバインドを解除する最も簡単な方法です。
$("#myspan").off("click");
複数のイベントハンドラを同じ要素のクリックイベントにバインドしている場合は、名前空間を指定してそれらを区別してから、適切な名前空間を使用します off
コール。
$("#myspan").on("click.test", function(e) { ... });
...
$("#myspan").off("click.test");
同じ名前空間を使用してバインドされた複数の異なるイベントハンドラをアンバインドしたい場合は、単に名前空間を使用してください:
$("#myspan").off(".test");
回答№2の6
あなたはイベントハンドラをバインドしていません testfunc
、あなたはそれを匿名関数にバインドし、あなたが呼んでいる関数をwhitinします testfunc
、自動的にバインド解除することはできません。
それはどちらか
$("#myspan").on("click", testfunc); // bind function
その後
$("#myspan").off("click", testfunc); // unbind function
または無名関数のバインドを解除するだけです
$("#myspan").off("click"); // remove all handlers
ハンドラの名前空間を設定することもできます
$("#myspan").on("click.test", function(e) {
var a = 1;
testfunc(a, e);
});
そのハンドラだけを削除する
$("#myspan").off("click.test");
回答№3の場合は1
この単純なケースでは、 off
これで電話する:
function del() {
$("#myspan").off("click");
}
ハンドラ関数を関数に渡す必要はありません off
それを行うと、特定のハンドラだけが削除されます。しかし、あなたは添付しませんでした testfunc
、ただ呼び出す無名関数 testfunc()
。したがって、あなたの off
コールは何もしません。
また、あなたは決して変数を割り当てませんでした testfunc
.