off()

移除一个事件处理函数。

.off(events[, selector ][, handler ])
  • events 类型: String 。一个或多个空格分隔的事件类型和可选的命名空间,或仅仅是命名空间,比如"click","keydown.myPlugin",或者".myPlugin"。
  • selector 类型: String 。一个选择器,当绑定事件处理程序时匹配最初传递给 .on() 的那个。
  • handler 类型: Function(Event eventObject)以前附加的事件处理函数,或特殊值 false
.off(events[, selector ])
  • events 类型: PlainObject 。一个对象的字符串键所代表的一个或多个空格分隔的事件类型和可选的命名空间,值表示先前事件绑定的处理函数。
  • selector 类型: String 。一个选择器,当绑定事件处理程序时匹配最初传递给 .on() 的那个。
.off(event)
  • event 类型: Event 。一个 jQuery .Event 对象.
.off()
  • 这个方法不接受任何参数

off() 方法移除用 .on() 绑定的事件处理程序。有关详细信息,请参阅该网页上delegated和directly绑定事件。可以通过提供组合的事件名,名字空间,选择器或处理函数来移除绑定在元素上指定的事件处理函数。 当有多个过滤参数时,只有与这些参数完全匹配的事件处理函数才会被移除。

如果一个简单的事件名称,比如提供 "click" ,那么 所有 这种类型的事件(包括直接和委派)从元素上被移除。对于写插件,或者基于大型代码而编程时,最好是通过名字空间进行事件绑定或移除操作,这样就不会意外的移除其它代码添加的事件处理函数。在一个特定的命名空间中的所有类型的事件,可以从一个元素中删除,只是提供了一个命名空间,比如 ".myPlugin" 。在移除事件处理时,至少要提供名字空间或事件名。

要删除特定的委派事件处理程序,需要提供一个 selector 的参数。该选择器字符串必须与之前通过 .on() 进行事件处理绑定时使用的选择器相一致。若要移除元素上所有的代理事件,而不移除任何非代理事件,请使用特殊值"**"。

处理程序也可以删除 handler 参数指定名称的函数。当jQuery的绑定一个事件处理程序,它分配一个唯一的ID给处理函数。函数用 jQuery.proxy() 代理或类似有相同的唯一ID机制(代理函数),因此,通过代理处理程序 .off 可能会删除比预期更多的处理程序。在这些情况下,最好是附加和移除事件处理程序,使用命名空间。

.on() 一样,你可以传递一个 events 参数明确的指定而不是用 events handler 作为单独参数。键是事件类型及可选的名字空间,值是绑定的处理函数,或者是特殊值 false

例子

为有颜色的按钮添加并移除事件处理。

<!DOCTYPE html>
<html>
<head>
  <style>
button { margin:5px; }
button#theone { color:red; background:yellow; }
</style>
  <script src="./static/js/jquery-3.5.0.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>

移除所有段落上的事件:

$("p").off()

R移除所有段落上的代理事件:

$("p").off( "click", "**" )

通过传入的第三个参数,仅移除先前绑定的事件处理函数:

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); 

通过指定名字空间,解除绑定表单上所有的代理事件:

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");

上篇: on()

下篇: one()