如何覆盖 jquery 事件处理程序
Posted
技术标签:
【中文标题】如何覆盖 jquery 事件处理程序【英文标题】:How to overwrite jquery event handlers 【发布时间】:2010-10-19 00:05:11 【问题描述】:我会尝试用一个简单的代码来解释这个问题。
var fireClick = function() alert('Wuala!!!') ;
$('#clickme').click(fireclick);
$('#clickme').click(fireclick);
所以现在它显然会提醒 2 次,但我只需要提醒一次。尝试了很多方法,但没有结果。
谢谢。
【问题讨论】:
您能否就绑定事件的调用如何最终发生两次提供一些上下文?也许您可以防止第二次调用稍微改变您的代码功能。 相关:***.com/questions/209029/… 是,“瞧”。 :) 如果它回答了您的问题,请标记答案,以便其他可能需要参考此问题的用户受益。 【参考方案1】:从 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);
【讨论】:
呸!您因链接呼叫而获胜,但可能会改进您的答案,以便仅删除重新添加的特定处理程序?所以: $('#clickme').unbind('click', fireclick).click(fireclick) 问题是“覆盖 jquery 事件处理程序”——我假设他想全部替换它们。为此,他需要每次都调用 unbind (这就是我对两者都重复调用的原因)并且不指定函数参数。 当您回答问题时,这绝对是正确的做法,所以我投了赞成票。也就是说,我相信“新的和改进的”方法是使用 on() 和 off() 方法。由于此答案是搜索“jquery replace event handler”的第一个谷歌结果,因此添加到您的答案中可能会有所帮助。$('#clickme').off('click').on('click', fireclick);
或简单的 $('#clickme').off('click').click(fireclick);
。
@IamChuckB 感谢您的更新,我已将其添加到我的答案中。【参考方案2】:
我会尝试消除额外的调用,但如果没有 tyhat,您可以确保每次都调用这两个:
$('#clickme').unbind('click', fireclick);
$('#clickme').click(fireclick);
【讨论】:
【参考方案3】:你可以使用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
【讨论】:
【参考方案4】:您应该使用 setInterval。问题是您不能同时弹出两个警报。第一个必须先关闭,否则第二个不能出现在屏幕上...
【讨论】:
【参考方案5】:使用命名空间确保您不会删除任何其他侦听器:
$('#clickme').off('click.XXX').on('click.XXX', fireclick);
只要没有其他代码使用XXX
,您就可以确定您没有搞砸一些您不知道的其他行为。
【讨论】:
【参考方案6】:$(document).off('click', '#clickme').on('click', '#clickme', fireclick);
【讨论】:
以上是关于如何覆盖 jquery 事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章