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中使用"with"语句中跨frame的变量引用问题
Mar 08 Javascript
Firefox中beforeunload事件的实现缺陷浅析
May 03 Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
May 03 Javascript
JavaScript更改原始对象valueOf的方法
Mar 19 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 Javascript
jquery.validate表单验证插件使用方法解析
Nov 07 Javascript
使用DeviceOne实现微信小程序功能
Dec 29 Javascript
图片懒加载插件实例分享(含解析)
Jan 09 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
JS中==、===你分清楚了吗
Mar 04 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 获取远程网页内容的函数
2009/09/08 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
PHP正则表达式入门教程(推荐)
2016/05/18 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
7个JS基础知识总结
2014/03/05 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
Javascript基础教程之if条件语句
2015/01/18 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
音乐教学随笔感言
2014/02/19 职场文书
关于爱国的标语
2014/06/24 职场文书
助学感谢信范文
2015/01/21 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
初中美术教学反思
2016/02/17 职场文书