我应该如何防止鼠标点击子元素时触发 mouseout 事件,而不使用 jQuery 呢?我知道这与事件冒泡有关,但是我找不到解决方法。
我在这里找到了一个类似的帖子:如何禁用由子元素触发的 mouseout 事件? 但是该解决方案使用了 jQuery。
使用 onmouseleave
。
或者,在jQuery中使用 mouseleave()
。
这正是你所寻找的东西。 例如:
<div class="outer" onmouseleave="yourFunction()">
<div class="inner">
</div>
</div>
或者,在jQuery中:
$(".outer").mouseleave(function(){
//your code here
});
一个示例在这里。
onMouseLeave
,因为它不会冒泡。 - Aleczmouseleave
无法被取消。 - user11910832如果需要一个更简单的纯CSS方案,在大多数情况下,可以通过将子元素的pointer-events
设置为none
来实现。
.parent * {
pointer-events: none;
}
浏览器支持: IE11+
pointer-events
属性。 - Zach Saucierfunction onMouseOut(event) {
//this is the original element the event handler was assigned to
var e = event.toElement || event.relatedTarget;
if (e.parentNode == this || e == this) {
return;
}
alert('MouseOut');
// handle mouse event here!
}
document.getElementById('parent').addEventListener('mouseout',onMouseOut,true);
我做了一个快速的 JsFiddle 演示,包含所有需要的 CSS 和 HTML,请查看...
编辑 为了跨浏览器支持,修复了链接http://jsfiddle.net/RH3tA/9/
注意 它只检查直接父元素,如果父 div 有嵌套的子元素,您必须通过遍历它们的父元素来寻找 "原始元素"
编辑 嵌套子元素的示例
编辑 为了适应各种浏览器,进行了修正
function makeMouseOutFn(elem){
var list = traverseChildren(elem);
return function onMouseOut(event) {
var e = event.toElement || event.relatedTarget;
if (!!~list.indexOf(e)) {
return;
}
alert('MouseOut');
// handle mouse event here!
};
}
//using closure to cache all child elements
var parent = document.getElementById("parent");
parent.addEventListener('mouseout',makeMouseOutFn(parent),true);
//quick and dirty DFS children traversal,
function traverseChildren(elem){
var children = [];
var q = [];
q.push(elem);
while (q.length > 0) {
var elem = q.pop();
children.push(elem);
pushAll(elem.children);
}
function pushAll(elemArray){
for(var i=0; i < elemArray.length; i++) {
q.push(elemArray[i]);
}
}
return children;
}
这里有一个新的JSFiddle,编辑更新了链接。
mouseleave
是正确的答案。 - Code Whisperercontains
,这使得它成为一个更加优雅的解决方案:function makeMouseOutFn(event) { e = event.toElement || event.relatedTarget; if (this.contains(e)) return; //handle mouse event here }
- Ian使用onmouseleave而不是onmouseout。
由于您没有向我们展示您的具体代码,因此我无法向您展示如何在您的特定示例中完成它。
但这非常简单:只需将onmouseout替换为onmouseleave。
就这样 :) 如此简单 :)
如果不确定如何操作,请参见以下解释:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out
小菜一碟 :) 尽情享受吧 :)
以下是一种更优雅的解决方案,基于以下内容。 它考虑了来自多个子级别的事件冒泡。 它也考虑到了跨浏览器问题。
function onMouseOut(this, event) {
//this is the original element the event handler was assigned to
var e = event.toElement || event.relatedTarget;
//check for all children levels (checking from bottom up)
while(e && e.parentNode && e.parentNode != window) {
if (e.parentNode == this|| e == this) {
if(e.preventDefault) e.preventDefault();
return false;
}
e = e.parentNode;
}
//Do something u need here
}
document.getElementById('parent').addEventListener('mouseout',onMouseOut,true);
this
可以解决这个问题。另外,为了更好的跨浏览器支持,请尝试以下代码:
if (window.addEventListener){
document.getElementById('parent').addEventListener('mouseout',onMouseOut,true);
}
else if (window.attachEvent){
document.getElementById('parent').attachEvent("onmouseout",onMouseOut);
} - DWils如果你正在使用jQuery,你也可以使用"mouseleave"函数,它会为你处理所有这些问题。
$('#thetargetdiv').mouseenter(do_something);
$('#thetargetdiv').mouseleave(do_something_else);
当鼠标进入目标div或其任何子元素时,do_something将触发,只有当鼠标离开目标div和其任何子元素时,do_something_else才会触发。
感谢启发我的Amjad Masad。
我有以下解决方案,似乎在IE9、Firefox和Chrome中都能正常工作,代码相当简短(没有复杂的闭包和遍历子元素的操作):
DIV.onmouseout=function(e){
// check and loop relatedTarget.parentNode
// ignore event triggered mouse overing any child element or leaving itself
var obj=e.relatedTarget;
while(obj!=null){
if(obj==this){
return;
}
obj=obj.parentNode;
}
// now perform the actual action you want to do only when mouse is leaving the DIV
}
mouseleave()
方法。<div id="parent" mouseleave="function">
<div id="child">
</div>
</div>
;)
我发现了一个非常简单的解决方案,只需使用onmouseleave="myfunc()"事件,而不是onmousout="myfunc()"事件。
在我的代码中,它起作用了!
示例:
<html>
<head>
<script type="text/javascript">
function myFunc(){
document.getElementById('hide_div').style.display = 'none';
}
function ShowFunc(){
document.getElementById('hide_div').style.display = 'block';
}
</script>
</head>
<body>
<div onmouseleave="myFunc()" style='border:double;width:50%;height:50%;position:absolute;top:25%;left:25%;'>
Hover mouse here
<div id='child_div' style='border:solid;width:25%;height:25%;position:absolute;top:10%;left:10%;'>
CHILD <br/> It doesn't fires if you hover mouse over this child_div
</div>
</div>
<div id="hide_div" >TEXT</div>
<a href='#' onclick="ShowFunc()">Show "TEXT"</a>
</body>
</html>
鼠标移出功能的相同示例:
<html>
<head>
<script type="text/javascript">
function myFunc(){
document.getElementById('hide_div').style.display = 'none';
}
function ShowFunc(){
document.getElementById('hide_div').style.display = 'block';
}
</script>
</head>
<body>
<div onmouseout="myFunc()" style='border:double;width:50%;height:50%;position:absolute;top:25%;left:25%;'>
Hover mouse here
<div id='child_div' style='border:solid;width:25%;height:25%;position:absolute;top:10%;left:10%;'>
CHILD <br/> It fires if you hover mouse over this child_div
</div>
</div>
<div id="hide_div">TEXT</div>
<a href='#' onclick="ShowFunc()">Show "TEXT"</a>
</body>
</html>