使用.on()附加到文档时无法删除特定的事件处理程序

时间:2013-04-08 19:50:22

标签: event-handling jquery jquery-on

这是演示我的情况的简单小提琴......

http://jsfiddle.net/UnsungHero97/EM6mR/17/

我正在做的是为current&添加一个事件处理程序。未来的元素,使用.on()。我希望能够在发生某些事情时为特定元素删除这些事件处理程序;在小提琴的情况下,当选择单选按钮时,应删除蓝色元素的事件处理程序,单击这些元素不应该再做任何事情了。

它似乎不起作用:(

如何删除我使用document为这些特定蓝色元素创建的.on()附加的事件处理程序?

3 个答案:

答案 0 :(得分:6)

.on().off()的签名必须匹配。

这两个不匹配,因此.off()调用将找不到要删除的匹配事件处理程序:

$(document).on('click', '.btn', function() {
    update();
});

$(document).off('click', '.blue');

注意,传递给.on().off()的选择器不同。


使用.on()的动态形式(将选择器作为参数传递给.on())时,不能仅删除部分项目。那是因为根元素上只安装了一个事件处理程序,jQuery只能删除整个事件或根本不删除。所以,你不能只是.off()一些动态项目。

您可以选择删除所有事件处理程序:

$(document).off('click', '.btn');

然后安装一个新的事件处理程序,排除您不想要的项目,如:

$(document).off('click', '.btn:not(.blue)');

或者,教导事件处理程序本身如何忽略.blue项:

$(document).on('click', '.btn', function() {
    if (!$(this).hasClass('blue')) {
        update();
    }
});

答案 1 :(得分:1)

小心你如何附上你的活动;这对我来说很好:

$('.btn').on('click', function() {
    update();
});

$('#disable').on('change', function() {
        $('.btn').off('click');
});

答案 2 :(得分:1)

似乎只有:

$('#disable').on('change', function() {

        $(document)
           .off('click', '.btn')
           .on('click', '.btn:not(.blue)', update);
    });