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 相关文章推荐
HTML代码中标签的全部属性 中文注释说明
Mar 26 Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 Javascript
JQuery中Bind()事件用法分析
May 05 Javascript
JavaScript入门教程之引用类型
May 04 Javascript
使用JSON作为函数的参数的优缺点
Oct 27 Javascript
js实现多行文本框统计剩余字数功能
Mar 28 Javascript
Vue2.0 组件传值通讯的示例代码
Aug 01 Javascript
详解ES6之async+await 同步/异步方案
Sep 19 Javascript
jQuery实现的两种简单弹窗效果示例
Apr 18 jQuery
小程序实现左滑删除功能
Oct 30 Javascript
JS中自定义事件的使用与触发操作实例分析
Nov 01 Javascript
js实现倒计时秒杀效果
Mar 25 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
用 PHP5 轻松解析 XML
2006/12/04 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
PHP反向代理类代码
2014/08/15 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
js 替换
2008/02/19 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
Python的Django框架中的Context使用
2015/07/15 Python
Python通过future处理并发问题
2017/10/17 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
python的pstuil模块使用方法总结
2019/07/26 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
大学班级学风建设方案
2014/05/01 职场文书
法人授权委托书样本
2014/09/19 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS