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 相关文章推荐
JS简单的轮播的图片滚动实例
Jun 17 Javascript
js动态往表格的td中添加图片并注册事件
Jun 12 Javascript
jquery显示隐藏input对象
Jul 21 Javascript
探讨JavaScript中的Rest参数和参数默认值
Jul 29 Javascript
基于jquery实现复选框全选,反选,全不选等功能
Oct 16 Javascript
JavaScript调试的多个必备小Tips
Jan 15 Javascript
基本DOM节点操作
Jan 17 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
Mar 02 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
Sep 18 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
Apr 20 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
Apr 02 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
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
php常用数学函数汇总
2014/11/21 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
Python远程linux执行命令实现
2020/11/11 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
集团公司总经理岗位职责
2013/12/20 职场文书
委托书怎样写
2014/08/30 职场文书
2014年转正工作总结
2014/11/08 职场文书
单位计划生育责任书
2015/05/09 职场文书
跑吧孩子观后感
2015/06/10 职场文书