返回值:jQueryoff(events, [selector], [handler(eventObject)])
移除事件处理函数。
-
1.7 新增off(events, [selector], [handler(eventObject)])
events (String) 一个或多个由空格分隔的事件类型及可选的名字空间,或者仅有名字空间。例如,"click", "keydown.myPlugin", 或 ".myPlugin"。selector (String) 可选参数,与之前通过.on()
进行绑定事件处理时相一致的选择器。handler(eventObject) (Function) 可选参数,之前为事件绑定的处理函数,或者是特殊值false
。 -
1.7 新增off(events-map, [selector])
events-map (Map) 一个映射,键是由一个或多个由空格分隔的事件类型及可选的名字空间,值是先前为该事件绑定的处理函数。selector (String) 可选参数,与之前通过.on()
进行绑定事件处理时相一致的选择器。
off()
方法会移除通过
.on()
绑定的事件处理函数。了解更多信息,请查看在 .on()
方法中关于代理事件及直接事件的相关讨论。可以通过提供组合的事件名,名字空间,选择器或处理函数来移除绑定在元素上指定的事件处理函数。当提供了多个过滤参数时,只有与这些参数完全匹配的事件处理函数才会被移除。
如果只简单的提供了诸如 "click"
这样的事件名,那么元素上所有该类型的事件(无论是直接事件还是代理事件)都会被移除。对于写插件,或者基于大型代码而编程时,最好是通过名字空间进行事件绑定或移除操作,这样就不会意外的移除其它代码添加的事件处理函数。可以通过名字空间,例如,".myPlugin"
来移除元素上所有与指定名字空间相匹配的事件,无论它是什么类型的事件。在移除事件处理时,至少要提供名字空间或事件名。
若要移除指定的代理事件,需要提供 selector
参数。该选择器字符串必须与之前通过 .on()
进行事件处理绑定时使用的选择器相一致。若要移除元素上所有的代理事件,而不移除任何非代理事件,请使用特殊值 "**"
。
同样可以通过在 handler
参数中指定函数名来移除对应的事件处理。当 jQuery 绑定一个事件处理时,jQuery 会为该事件处理赋予一个独一无二的 id 值。通过
jQuery.proxy()
进行的事件代理,或类似的机制会使用这个 id(proxy 函数),因此若向 .off
中传入了代理的事件处理函数,移除的处理函数可以会比预计的多。在这种情况下,最好是使用名字空间进行事件的绑定和移除。
与 .on()
一样,您可以传入一个 events-map
参数来取代 events
和 handler
参数。键是事件类型及可选的名字空间,值是绑定的处理函数,或者是特殊值 false
。
示例:
为有颜色的按钮添加并移除事件处理。
<!DOCTYPE html>
<html>
<head>
<style>
button { margin:5px; }
button#theone { color:red; background:yellow; }
</style>
<script src="jquery.min.js"></script>
</head>
<body>
<button id="theone">Does nothing...</button>
<button id="bind">Add Click</button>
<button id="unbind">Remove Click</button>
<div style="display:none;">Click!</div>
<script>
function aClick() {
$("div").show().fadeOut("slow");
}
$("#bind").click(function () {
$("body").on("click", "#theone", aClick)
.find("#theone").text("Can Click!");
});
$("#unbind").click(function () {
$("body").off("click", "#theone", aClick)
.find("#theone").text("Does nothing...");
});
</script>
</body>
</html>
演示:
示例:
移除所有段落上的事件:
jQuery 代码:
$("p").off()
示例:
移除所有段落上的代理事件:
jQuery 代码:
$("p").off( "click", "**" )
示例:
通过传入的第三个参数,仅移除先前绑定的事件处理函数:
jQuery 代码:
var foo = function () {
// code to handle some kind of event
};
// ... now foo will be called when paragraphs are clicked ...
$("body").on("click", "p", foo);
// ... foo will no longer be called.
$("body").off("click", "p", foo);
示例:
通过指定名字空间,解除绑定表单上所有的代理事件:
jQuery 代码:
var validate = function () {
// code to validate form entries
};
// delegate events under the ".validator" namespace
$("form").on("click.validator", "button", validate);
$("form").on("keypress.validator", "input[type='text']", validate);
// remove event handlers in the ".validator" namespace
$("form").off(".validator");