javascript中mouseover、mouseout使用详解


Posted in Javascript onJuly 19, 2015

本文并没有像标题说的那样,真正阻止事件元素的子元素冒泡...

只是在子元素冒泡到事件元素处时进行了一个判断,判断是否要触发事件,哦...不对 应该是是否要运行事件函数中的相关操作...

首先你可以猛戳这里: 问题的出现

 注:jquery中的mouseover/out事件也有此问题

解决方法一:

在ie下有mouseenter 与 mouseleave事件来替代mouseover 和 mouseout。

网上很多说法,这两个事件只有ie支持,其他浏览器不支持。

但是我在最新版本的火狐与谷歌都支持了mouseenter 与 mouseleave!!!!!

另外ie是的支持范围是:[ie5+ ,所以我们还是别喷ie了...

其他浏览器测试了下:

在Firefox/3.6.28是不支持mouseenter 与 mouseleave的,Firefox具体从哪个版本开始支持这两个事件,就不得而知了...

                 在Opera9.50 Alpha 与Opera9.00 Beta都不支持。其实Opera现在完全可以不要测试了,最新版的Opera都是webkit内核...

谷歌低版本未测试...

当然这些老版本浏览器基本可以不用管了,所以这应该是最好的解决办法了:用mouseenter 与 mouseleave事件来替代mouseover 和 mouseout。

此二事件的实例戳这:mouseenter与mouseleave

 注:jquery中也有mouseenter 与 mouseleave事件,兼容所有浏览器。

解决方法二:

上面那个方法在老版本的火狐与谷歌是不支持的,如果你希望得到最大范围的兼容,那可以继续往下看

我们利用var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement 来获取事件相关元素。再通过这个事件相关元素它跟事件元素的关系(包含的关系),来判断是否做相关事件处理。

对于mouseout事件来说,reltg就是鼠标指针离开目标时,鼠标指针进入的节点。

对于mouseover 事件来说,reltg就是鼠标指针移到目标节点上时所离开的那个节点。

在li的mouseout的事件函数中,如果reltg为li的子元素我们就不要运行相关操作,如果reltg为li的父元素就运行相关操作。

我们可以通过下面的isMouseLeaveOrEnter函数来判断li与reltg的包含关系:

//判断事件相关元素与li的关系 如果事件相关元素为li的子元素就返回false 反之返回true
function isMouseLeaveOrEnter(e, handler) { 
if (e.type != 'mouseout' && e.type != 'mouseover') return false; 

var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement;

while (reltg && reltg != handler) reltg = reltg.parentNode;

return (reltg != handler);
};

Li.onmouseout = function(e) {

e = e||window.event;

if (isMouseLeaveOrEnter(e,this)) {


//运行相关操作

};
}

 此方法明显的缺点就是isMouseLeaveOrEnter中要遍历所有的父元素了,性能问题

解决方法三:

此方法与方法二其实思路是一样的,只是我们这里通过compareDocumentPosition/contains来判断li与reltg的包含关系,优化了方法二遍历所有父元素带来的性能问题。

直接看代码吧:

//判断node是否为parent的子元素
//if node == parent 也会返回true
function contains(parent, node) {
if(parent.compareDocumentPosition){ //ff


var _flag = parent.compareDocumentPosition(node); 


return (_flag == 20 || _flag == 0)? true : false; 

}else if(parent.contains){ //ie


return parent.contains(node);

}
};

Li.onmouseout = function(e) {

e = e||window.event;

var relatedEle = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement

if (!contains(this, relatedEle)) {


show.innerHTML=show.innerHTML+'0';

}

}

compareDocumentPosition() 方法比较两个节点,并返回描述它们在文档中位置的整数。

返回值可能是:

1:没有关系,两个节点不属于同一个文档。

2:第一节点(P1)位于第二个节点后(P2)。

4:第一节点(P1)定位在第二节点(P2)前。

8:第一节点(P1)位于第二节点内(P2)。

16:第二节点(P2)位于第一节点内(P1)。

32:没有关系,或是两个节点是同一元素的两个属性。

注释:返回值可以是值的组合。例如,返回 20 意味着在 p2 在 p1 内部(16),并且 p1 在 p2 之前(4)。

而[ie8- 不支持compareDocumentPosition()方法,需要用contains代替compareDocumentPosition()方法那么强大,它是用来确定 nodeB 是否包含在另一个  nodeA 中:nodeA .contains( nodeB )

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
用JavaScript和注册表脚本实现右键收藏Web页选中文本
Jan 28 Javascript
通过隐藏option实现select的联动效果
Nov 10 Javascript
js简单实现交换Li的值
May 22 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
javascript实现在指定元素中垂直水平居中
Sep 13 Javascript
jQuery插件zTree实现的多选树效果示例
Mar 08 Javascript
vue实现验证码输入框组件
Dec 14 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
Apr 04 Javascript
layui监听工具栏的实例(操作列表按钮)
Sep 10 Javascript
JS操作json对象key、value的常用方法分析
Oct 29 Javascript
原生JS实现留言板
Mar 26 Javascript
在Vue中获取自定义属性方法:data-id的实例
Sep 09 Javascript
javascript实现的简单计时器
Jul 19 #Javascript
javascript中setInterval的用法
Jul 19 #Javascript
js中跨域方法原理详解
Jul 19 #Javascript
javascript获取网页宽高方法汇总
Jul 19 #Javascript
jQuery获取URL请求参数的方法
Jul 18 #Javascript
jQuery增加自定义函数的方法
Jul 18 #Javascript
jQuery插件简单实现方法
Jul 18 #Javascript
You might like
PHP开发负载均衡指南
2010/07/17 PHP
在项目中寻找代码的坏命名
2012/07/14 PHP
深入理解PHP中的global
2014/08/19 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
sina的lightbox效果。
2007/01/09 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
在cmd中查看python的安装路径方法
2019/07/03 Python
Python中os模块功能与用法详解
2020/02/26 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
三严三实心得体会范文
2014/10/13 职场文书
水电工岗位职责
2015/02/14 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技