如何覆盖jquery事件处理程序

时间:2009-04-12 11:25:36

标签: jquery event-handling

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

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

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

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

感谢。

6 个答案:

答案 0 :(得分:128)

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

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

原始答案:

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

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

答案 1 :(得分:22)

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

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

只要没有其他代码使用XXX,您就可以确定没有搞砸其他一些您不知道的行为。

答案 2 :(得分: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 :(得分:3)

我会尝试消除额外的电话,但是你可以确保每次调用这两个电话:

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

答案 4 :(得分:0)

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

答案 5 :(得分:-9)

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