如何覆盖jquery事件处理程序

tar*_*ras 73 jquery event-handling

我将尝试用简单的代码解释问题.

var fireClick = function() { alert('Wuala!!!') };

$('#clickme').click(fireclick);
$('#clickme').click(fireclick);
Run Code Online (Sandbox Code Playgroud)

所以现在它会明显提醒2次,但我只需要提醒一次.尝试了很多方法,但没有结果.

谢谢.

tva*_*son 131

在jQuery 1.7中,你应该使用,以移除事件处理程序,并添加它们,但你仍然可以使用click简写.

$('#clickme').off('click').on('click', fireclick);
$('#clickme').off().on('click', fireclick);
Run Code Online (Sandbox Code Playgroud)

原始答案:

如果要替换所有单击处理程序,请先调用unbind而不使用函数参数.如果要替换所有事件处理程序,请不要指定事件类型.

$('#clickme').unbind('click').click(fireclick);
$('#clickme').unbind().click(fireclick);
Run Code Online (Sandbox Code Playgroud)

  • 问题是"覆盖jquery事件处理程序" - 我假设他想要替换它们.要做到这一点,他需要每次调用unbind(这就是为什么我重复两次调用)并且不指定函数参数. (4认同)
  • 当你回答这个问题时,这绝对是正确的方法,所以我已经投了赞成票.也就是说,我相信"新的和改进的"方法是使用on()和off()方法.由于此答案是搜索"jquery replace event handler"的第一个google结果,因此添加到您的答案可能会有所帮助.`$('#clickme').off('click').on('click',fireclick);`或只是`$('#clickme').off('click').click(fireclick);` . (3认同)

Nei*_*ens 23

使用命名空间以确保不删除任何其他侦听器:

$('#clickme').off('click.XXX').on('click.XXX', fireclick);
Run Code Online (Sandbox Code Playgroud)

只要没有其他代码使用XXX,您可以确定您没有弄乱其他一些您不知道的行为.


mof*_*off 18

您可以使用jQuery函数取消绑定来删除第一个事件:

var fireClick = function() { alert('Wuala!!!') };

$('#clickme').click(fireclick);
$('#clickme').unbind('click', fireClick); // fireClick won't fire anymore...
$('#clickme').click(fireclick); // ...but now it will
Run Code Online (Sandbox Code Playgroud)