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 Archive Network 集合
May 12 Javascript
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
Jan 13 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
May 30 Javascript
Javascript操作dom对象之select全面解析
Apr 24 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
Oct 16 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
May 08 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 Javascript
vue项目中定义全局变量、函数的几种方法
Nov 08 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
javaScript call 函数的用法说明
2010/04/09 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
python 获取图片分辨率的方法
2019/01/08 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
Python中turtle库的使用实例
2019/09/09 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
python主要用于哪些方向
2020/07/05 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
酒店管理毕业生自我鉴定
2014/03/02 职场文书
项目工作说明书
2014/07/29 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
2015年班干部工作总结
2015/04/29 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python