使用.off()删除多个相同的事件处理程序

时间:2016-08-25 11:38:26

标签: javascript jquery

我分配了两个事件处理程序:

$('#myElement').on('click', '.classA', doSomething);
$('#myElement').on('click', '.classB', doSomethingElse);

我想删除这两个处理程序。我知道我能做到:

$('#myElement')
    .off('click', '.classA')
    .off('click', '.classB');

我认为这可能在一行中,但这两个都失败了:

$('#myElement').off('click', '.classA, .classB');
$('#myElement').off('click', '.classA .classB');

有没有办法在一个命令中执行此操作?

2 个答案:

答案 0 :(得分:3)

查看来源后,您会看到off: -

return this.each( function() {
    jQuery.event.remove( this, types, fn, selector );
}

这意味着选择器必须与其创建方式完全相同。

因此您需要使用: -

$('#myElement').on('click', '.classA', function() { alert('A'); });
$('#myElement').on('click', '.classB', function() { alert('B'); });

$('#myElement').off('click', '.classA').off('click', '.classB');

$('#myElement').on('click', '.classA', function() { alert('A'); });
$('#myElement').on('click', '.classB', function() { alert('B'); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="myElement">
  <button class="classA">A</button>
  <button class="classB">B</button>
</div>

答案 1 :(得分:0)

在这里,您使用点式命名空间来识别单个处理程序,这很好,但是因为它被称为&#34;命名空间&#34;通过jQuery文档,它看起来像css类,它更适合与一组处理程序匹配。所以如果你不区分这两个事件&#34; classA&#34;和&#34; classB&#34;,你可以使用&#34; classCommon&#34;对于他们两个,并在以后使用&#34; classCommon&#34;将它们解开绑定,我刚刚在off's document page上找到了一个示例(参见最后一个示例,位于页面底部)。

正如上面其他人所建议的那样,所有这些必须发生在同一个元素上。确切地说,选择相同的选择器。因此,如果您对多个HTMLElements提出疑问,则需要将#myElement更改为.elementsIWantToHandleTogether