如何覆盖jQuery事件处理程序


74

我将尝试用一个简单的代码来解释这个问题。

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

$('#clickme').click(fireclick);
$('#clickme').click(fireclick);

所以现在它显然会发出2次警报,但我只需要发出一次警报。尝试了很多方法,但没有结果。

谢谢。


您能否提供一些有关绑定事件的调用如何最终发生两次的上下文?也许可以防止第二个调用稍微改变代码的功能。
Mark Renouf


19
是“ Voila”。:)
马克·艾伦2009年

2
如果它回答了您的问题,请标记答案,以使其他用户可能需要参考此问题。
Sayan 2012年

Answers:


134

从jQuery 1.7开始,您应该使用off来删除事件处理程序,然后使用on来添加它们,尽管您仍然可以使用click简写形式。

$('#clickme').off('click').on('click', fireclick);
$('#clickme').off().on('click', fireclick);

原始答案:

如果要替换所有单击处理程序,请先调用不带函数参数的取消绑定。如果要替换所有事件处理程序,请不要指定事件类型。

$('#clickme').unbind('click').click(fireclick);
$('#clickme').unbind().click(fireclick);

1
呸! 您因链接呼叫而获胜,但也许可以优化您的答案,以便仅删除要重新添加的特定处理程序?因此:$('#clickme')。unbind('click',fireclick).click(fireclick)
Mark Renouf

4
问题是“覆盖jquery事件处理程序”-我假设他想全部替换它们。为此,他需要每次都取消绑定调用(这就是为什么我在两者上都重复调用)并且不指定函数参数的原因。
tvanfosson

3
当您回答问题时,这绝对是正确的方法,因此,我已投票赞成。也就是说,我相信on()和off()方法是“新的和改进的”方法。由于此答案是搜索“ jquery replace event handler”的第一个Google搜索结果,因此添加到答案中可能会有所帮助。$('#clickme').off('click').on('click', fireclick);或简单地说$('#clickme').off('click').click(fireclick);
chucksmash 2013年

@IamChuckB感谢您的更新,我已将其添加到我的答案中。
tvanfosson

24

使用名称空间来确保您不会删除任何其他侦听器:

$('#clickme').off('click.XXX').on('click.XXX', fireclick);

只要没有其他代码使用XXX,就可以确保没有弄乱您不知道的其他行为。


18

您可以使用jQuery函数unbind删除第一个事件:

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

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

3

我会尝试消除多余的通话,但是如果您不做任何事情,您可以确保每次都拨打这两个电话:

$('#clickme').unbind('click', fireclick);
$('#clickme').click(fireclick);


-11

您应该使用setInterval。问题是您不能同时弹出两个警报。第一个必须先关闭,第二个则不能出现在屏幕上...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.