取消绑定jQuery Click事件并不总是有效

时间:2015-12-03 12:42:06

标签: javascript jquery javascript-events

看一看 http://jsfiddle.net/60j9hhz7/3/

UPDATED FIDDLE(使用此) http://jsfiddle.net/60j9hhz7/10/

HTML:

<div class="mycontainer">
  <a href="#" class="test">test</a>   
</div><br/>
<a href="#" class="unbind">doesn't work</a><br />
<a href="#" class="unbind2">works</a><br />
<a href="#" class="unbind3">works too</a>

JS:

$(document).on('click', '.test', function (e) {
  alert('hello');
});

$(document).on('click', '.unbind', function (e) {
  $(document).off('click', '.mycontainer a');
});

$(document).on('click', '.unbind2', function (e) {
   $(document).off('click');
});

$(document).on('click', '.unbind3', function (e) {
  $(document).off('click', '.test');
});

在小提琴中,您会看到第一个 off 无法正常工作(警报仍会弹出),而所有其他人都可以正常工作。

有人可以解释为什么会这样,是否有解决方案? 我需要能够定位某个容器中的所有链接,但是他们可能已经使用不同的选择器连接了他们的点击事件。

问题是 unbind2 太不明确了, unbind3 太具体了

由于

2 个答案:

答案 0 :(得分:3)

以下问题需要.off()使用与绑定.on()事件相同的选择器

$(document).on('click', '.test', function (e) {//see .test
  alert('hello');
});

$(document).on('click', '.unbind', function (e) {
  $(document).off('click', 'a');//will not work
});

$(document).on('click', '.unbind2', function (e) {
   $(document).off('click');
});

$(document).on('click', '.unbind3', function (e) {
  $(document).off('click', '.test');//will work
});

EXP2:

$(document).on('click', '.mycontainer a', function (e) {
  alert('hello');
});

$(document).on('click', '.unbind', function (e) {
  $(document).off('click', '.mycontainer a');//will work 
});

$(document).on('click', '.unbind2', function (e) {
  $(document).off('click');
});

$(document).on('click', '.unbind3', function (e) {
  $(document).off('click', '.test');//will not work
});

http://jsfiddle.net/60j9hhz7/11/

答案 1 :(得分:2)

off() doc中解释了这一点(等等,确实可能很模糊......):

.off(events [,selector] [,handler])

<强>选择 输入: String

  

一个选择器,它应该与最初传递给.on()的选择器匹配   附加事件处理程序