更新的答案::
在评论中,你说:
好的。我有一个jsfiddle来解释这个问题。http://jsfiddle.net/KT42n/3 我想从容器中删除所有元素的处理程序
和
不幸的是,在我的情况下,使用命名空间是不可能的
糟糕。这将使它非常困难,因为一些委托处理程序可能涉及容器内外的元素。
唯一想到的事情需要列出您想要防止的所有事件名称(并不是很多):
$(".container").on("click mousedown mouseup etc.", false);
那样可以在事件到达
body
之前停止它,因此委托处理程序就不会看到它:
实时示例。
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<meta charset=utf-8 />
<title>Stop Delegated Handlers Within Container</title>
</head>
<body>
<p>Outside the container</p>
<div class="container">
<p>Inside the container</p>
</div>
<script>
(function() {
$("body").on("click", "p", function() {
display("paragraph clicked");
});
$(".container").on("click mousedown etc", false);
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>
原始回答:
您可以像这样从 body
中删除所有处理程序:
$("body").off();
这包括委托的处理程序。
如果你想保留一些处理程序但不保留其他处理程序,我能想到的最简单的方法是在挂钩事件时对其进行命名空间处理,例如:
$("body").on("click.foo", "selector", ...);
...等等。然后您可以使用命名空间来删除它们:
$("body").off(".foo", "selector");
...或者仅仅是
$("body").off(".foo");
我希望您能完全删除所有命名空间,而不仅仅是该选择器的命名空间。
示例:实时副本
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<meta charset=utf-8 />
<title>Removing All Delegated Handlers</title>
</head>
<body>
<div class="clickable">Click me</div>
<div class="mousemoveable">Mouse over me</div>
<input type="button" id="theButton" value="Remove handlers">
<script>
(function() {
$("body").on("click.foo", ".clickable", function() {
display("click");
});
$("body").on("mousemove.foo", ".mousemoveable", function() {
display("mousemove");
});
$("#theButton").click(function() {
$("body").off(".foo");
});
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>