我想点击body
,menutop
内的body
除外。
<body>
<div id="menutop">lorem ipsum...</div>
...
</body>
JS
$("body").not($("#menutop")).click(function(){
console.log("323");
});
也尝试了
var n = $("#menutop");
$("body:not(n)").click(function(){
console.log("323");
});
但在两种情况下都会点击menutop
控制台显示323
答案 0 :(得分:15)
选择器$("body").not($("#menutop"))
会选择body
元素,如果它不是#menutop
元素。由于body
元素显然不是#menutop
元素,因此仍然会选中body
元素并将click事件附加到该元素。
即使您单击#menutop
元素,点击事件仍会冒泡并触发body
元素上的点击事件,因此一个选项是检查是否{{ 1}}是event.target
元素:
#menutop
或者,您也可以在点击$(document).on('click', function (event) {
if (!$(event.target).closest('#menutop').length) {
// ... clicked on the 'body', but not inside of #menutop
}
});
元素时抑制事件冒泡和stop event propagation:
#menutop
答案 1 :(得分:5)
您可以在menutop元素上使用event.stopPropagation()
,以防止点击进入下方的身体。
有关解决方案,请参阅此codepen
<强> JS 强>
$("body").click(function(){
alert("323");
});
$("#menutop").click(function(event) {
event.stopPropagation();
});
答案 2 :(得分:1)
$('#menutop').click(function(event) {
event.stopPropagation();
})
stopPropagation()会让你的点击向下传播,并激活身体上的点击。
答案 3 :(得分:0)
我们将处理全身的点击事件,然后识别事件的源元素如下
我们将忽略以上两种情况触发的事件,并为其余触发事件执行所需的操作。
$("body").click(function(event){
if(
document.getElementById("menutop").isSameNode(event.target)
|| document.getElementById("menutop").contains(event.target)
){
// Event triggered from within the #menutop div element
// Do nothing and return
return;
}
// We are here because click event triggered from outside of #menutop div element
alert('Click event triggered from outside of #menutop div element');
});