input - 在jQuery中哪种移除事件处理程序的方法最好?

  显示原文与译文双语对照的内容

我有一个 input type="image" 。这类似于微软Excel中的单元格注释。 如果有人进入到文本框数量这个 input-image 搭配, input-image 我设置一个事件处理程序。 当用户单击 image, 他们得到一个小弹出一些笔记添加到数据。

我的问题是,当一个用户输入一个0到文本框,我需要禁用 input-image 事件的处理程序。 我已经尝试了以下,但没有使用。


$('#myimage').click(function { return false; });

时间:

[2011 - jQuery 1.7 <]

随着 jQuery 1.7的向前发展,事件API已经更新,.bind()/.unbind() 仍然可以用于向后兼容,但是首选方法是使用 on()/off() 函数。 下面将是


$('#myimage').click(function() { return false; });//Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() {/* Do stuff */});
$('#myimage').off('click.mynamespace');


在你的示例代码中,你只是在图像中添加另一个单击事件,而不是覆盖前一个事件:


$('#myimage').click(function() { return false; });//Adds another click event

同时单击事件将被激发。

就像人们所说的,你可以使用绑定来删除所有点击事件:


$('#myimage').unbind('click');

如果要添加单个事件,然后将它的删除,则可以使用事件命名空间:


$('#myimage').bind('click.mynamespace', function() {/* Do stuff */});

并只删除你的事件:


$('#myimage').unbind('click.mynamespace');

这里问题在回答这里问题时不可用,但你也可以使用 live() 方法来启用/禁用事件。


$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

这里代码会发生什么,当你单击 #mydisablebutton, 时,它将把类添加到 #myimage 元素。 这将使选择器不再匹配元素,并且在'已经禁用'类被删除之前不会激发事件,使. live() 选择器再次生效。

通过添加基于该类的样式也有其他好处。

这可以通过取消绑定函数完成。


$('#myimage').unbind('click');

你可以在jquery中添加多个事件处理程序到同一个对象和事件。 这意味着添加一个新的并不替换旧的。

有几种更改事件处理程序的策略,比如事件名称空间。 在线文档中有一些关于这个的页面。

看看这个问题( 这就是我学会取消绑定的方式) 。 这些策略在答案中有一些有用的描述。

如何读取 jquery 中绑定的悬停回调函数

如果你只想对事件进行一次时间的响应,那么以下语法应该非常有用:


 $('.myLink').bind('click', function() {
//do some things

 $(this).unbind('click', arguments.callee);//unbind *just this handler*
 });

使用 arguments.callee, 我们可以确保一个特定anonymous-function处理程序被删除,因此,有一个时间为一个给定的事件处理程序。 希望这有助于其他人。

我必须使用prop和attr将事件设置为 null 。 我不能用一个或者另一个。 我也无法获取。取消绑定工作。 我正在处理一个TD元素。


.prop("onclick", null).attr("onclick", null)

感谢你的信息。非常有用,我使用它来在编辑模式下使用另一个用户锁定页面交互。 我与ajaxComplete一起使用它。 不是necesarily相同的行为,但有点相似。


function userPageLock(){
 $("body").bind("ajaxComplete.lockpage", function(){
 $("body").unbind("ajaxComplete.lockpage");
 executePageLock(); 
 });
}; 

function executePageLock(){
//do something
}

如果这样事件附加,目标是独立的:


$('#container').on('click','span',function(eo){
 alert(1);

 $(this).off();//seams easy, but does not work

 $('#container').off('click','span');//clears click event for every span

 $(this).on("click",function(){return false;});//this works.

});​

你可能正在将onclick处理程序添加为内联标记:


<input id="addreport" type="button" value="Add New Report" onclick="openAdd()"/>

如果是的话,jquery. off() 或者. unbind() 将无法工作。 你还需要在jquery中添加原始事件处理程序:


$("#addreport").on("click","", function (e) {
 openAdd();
});

然后,jquery有一个对事件处理程序的引用,可以删除它:


$("#addreport").off("click")

VoidKing在上面的评论中提到了这一点。

...