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 相关文章推荐
基于jquery的超简单上下翻
Apr 20 Javascript
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
基于jquery实现的文字淡入淡出效果
Nov 14 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
Nov 22 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
JavaScript实现数字数组按照倒序排列的方法
Apr 06 Javascript
js调用webservice构造SOAP进行身份验证
Apr 27 Javascript
Jquery中attr与prop的区别详解
May 27 jQuery
随机生成10个不重复的0-100的数字(实例讲解)
Aug 16 Javascript
浅谈React前后端同构防止重复渲染
Jan 05 Javascript
AngularJS模态框模板ngDialog的使用详解
May 11 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用户注册时常用的检验函数实例总结
2014/12/22 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
js闭包用法实例详解
2016/12/13 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
python爬虫基本知识
2018/03/05 Python
Django组件content-type使用方法详解
2019/07/19 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
毕业生自我鉴定
2013/11/05 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
火车来了教学反思
2014/02/11 职场文书
房地产广告词大全
2014/03/19 职场文书
国旗下的演讲稿
2014/05/08 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS