JSFIDDLE:http://jsfiddle.net/w55usyqk/
单击div时,会触发两个单独的单击事件。它们分别在控制台日志中打印出“单击”和“单击”。
$("div").on("click", function() { console.log("click"); });
$("div").on("click", function() { console.log("clicked"); });
如果点击按钮,它将从div对象中删除两个事件声明
$("button").on("click", function() { $("div").off("click"); });
但是,如果我只需要删除单击事件怎么办?这是存储在某种事件数组中,我可以在$("div").off("click")[1]
行中执行某些操作;还是不能在不关闭另一个的情况下关闭一个?
如果以前发布过,我确实试过寻找答案。我认为这是难以言喻的问题之一,所以虽然可能有答案,但很难确定。
答案 0 :(得分:4)
使用命名函数作为事件处理程序,因此您可以引用要取消绑定的处理程序:
function clicOne() {console.log("click");};
function clicTwo() {console.log("clicked");};
$("div").on("click", clickOne);
$("div").on("click", clicTwo);
$("button").on("click", function() { $("div").off("click", clickOne); });
答案 1 :(得分:4)
您可以使用命名空间轻松完成此操作。创建事件处理程序时,请在事件后添加命名空间。例如:
$("div").on("click.namespace1", function() { console.log("click"); });
$("div").on("click.namespace2", function() { console.log("clicked"); });
然后为您的按钮,使用事件的命名空间删除:
// remove only the event for namespace2
$("button").on("click", function() { $("div").off(".namespace2"); });
<强> jsFiddle example 强>
namespaces for events上的其他内容:
事件名称可以由简化的事件名称空间限定 删除或触发事件。例如,
"click.myPlugin.simple"
为此特定定义了myPlugin和简单命名空间 点击事件。通过该字符串附加的单击事件处理程序可以是 已删除,.off("click.myPlugin")
或.off("click.simple")
没有 令人不安的其他点击处理程序附加到元素。命名空间 类似于CSS类,因为它们不是分层的;只有一个 名称需要匹配。以下划线开头的命名空间是 保留给jQuery使用。