【发布时间】:2014-08-01 19:34:55
【问题描述】:
用 div 创建一个窗口并使用 mouseover - mouseout 有一个已知问题:如果里面有一个子 div,它会触发 mouseout。最近由 mouseenter 和 mouseleave 解决了这个问题,因为除非鼠标点离开根 div(真正的窗口),否则不会触发。不幸的是,有很多浏览器无法识别这些新事件,如this article 所示。 :
- 火狐7
- 铬 14
- Safari 5.1
我认为可以使用 mouseover 和 mouseout 的事件冒泡处理来产生所需的效果。是否可以?还有另一种(更好的)方法吗?还是根本做不到?
Obs.:在这个项目中没有使用 jQuery。
编辑:我的测试代码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Mouse Events Tester</title>
<script>
var inside = function(e){
console.log("I am inside!");
}
var outside = function(e){
if(e.target !== this) console.log("Now outside...");
}
function targetOnly(handler) {
return function (e) {
if (e.target === this)
return handler.apply(this, arguments);
return;
};
}
function ini(){
document.getElementById("win").addEventListener("mouseover", inside, false);
document.getElementById("win").addEventListener("mouseout", outside, false);
}
</script>
</head>
<body onload="ini();">
<div id="win" style="border:#000 solid 2px; background-color:#999;">
<p>Window</p>
<div id="anything" style="border:#000 dashed 1px; background-color:#CCC;">
<p>An object inside the window</p>
</div>
</div>
</body>
</html>
【问题讨论】:
-
查看
e.target并与this比较,如果e.target !== this,则事件来自子节点 -
你有理由支持这些旧浏览器吗?
-
@JamesMontagne:我正在使用 Safari 5.1 进行开发,列表中的东西对我有用,对吧?
-
@PaulS.:有趣!你为什么不发布答案?
标签: javascript events mouseevent