2013-03-12 114 views
8

我有一个元件,其上有如何使用jquery从HTML元素中删除特定的事件回调?

// First callback 
$("#element").click(fn1); 

// Second callback 
$("#element").click(fn2); 

// Definitions 
function fn1(){console.log("1");} 
function fn2(){console.log("2");} 

几个回调网页有没有办法只删除FN2通过jQuery的触发回调的列表。 我知道我可以在函数和某个全局变量中添加'if',但那不是我要找的。

回答

4

unbind函数中的第二个参数指定解除绑定的处理程序。

$("#element").unbind("click", fn2); 

工作实例:http://jsfiddle.net/k73Nx/

+1

要看什么版本。如果它是全新的(1.7+),那么这个答案就不好。使用$('#element')。off('click'); – Adam 2013-03-12 09:35:42

+0

@Adam,'unbind()'既不被弃用也不被移除(例如'live()')。你仍然可以用它作为'off()'的等价物。 – 2013-03-12 09:37:04

+0

@FrédéricHamidi - 同意,但是直接来自jQuery文档本身:(从jQuery 1.7起,首选.on()和.off()方法可以附加和删除元素上的事件处理程序。) - 听起来像是解除绑定绑定将很快被弃用。为什么不听警告? – Adam 2013-03-12 09:39:17

0

使用.off

$("#element").off("click",fn2); 

working fiddle

+1

这将删除附加到处理#element上的点击的body元素的事件处理程序 - 在问题中,海报将单击事件添加到元素本身,因此这不起作用。 – Adam 2013-03-12 09:40:19

+0

是的..谢谢@Adam ...更新.. :) .. – bipen 2013-03-12 09:41:38

+0

你能提供一个小提琴吗?我无法下班工作,我想知道它是否因为它没有与'' – 2013-03-12 09:46:26

1

在这里小心你的语法,其他的答案与他们的非常宽松。

如果你使用:

$('#element').on('click',function() { 
//callback code 
}); 

则必须使用:

$('#element').off('click'); 

不能使用

$('body').off('click','#element',function() { }); 

$(document).off('click','#element',function() { }); 

因为您最初将您的活动绑定到#element,而不是文档或正文。

3

有趣的是,没有人提到命名空间。这是有原因的吗?

当附加你的事件时,你可以命名空间。而不是$(elem).on('click', fn)您可以将名称空间添加到click事件。 $(elem).on('click.namespaced', fn)

解除绑定后,您可以使用命名空间解除该确切事件的绑定。 $(elem).off('click.namespaced')

这是最实际的,当你定义你的事件函数内联。你可以使用命名空间做

一件事就是取消绑定namespae内所有类型的事件只是一个单一的电话:$(elem).off('.namespaced')

相关问题