/ / jquery .offは動作していないようです - javascript、jquery

jquery .offは動作していないようです - javascript、jquery

だから私は短いだろう: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.