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面向对象编程之如何实现方法重载
Jul 02 Javascript
使用js画图之圆、弧、扇形
Jan 12 Javascript
JavaScript的面向对象编程基础
Aug 13 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
May 21 Javascript
angular双向绑定模拟探索
Dec 26 Javascript
JavaScript中创建对象的7种模式详解
Feb 21 Javascript
详解angular用$sce服务来过滤HTML标签
Apr 11 Javascript
JS中注入eval, Function等系统函数截获动态代码
Apr 03 Javascript
jquery实现点击弹出对话框
Feb 08 jQuery
Vue结合路由配置递归实现菜单栏功能
Jun 16 Javascript
Vue-cli 移动端布局和动画使用详解
Aug 10 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
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
js单词形式的运算符
2014/05/06 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
基于python实现对文件进行切分行
2020/04/26 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
教你怎样写好自我评价
2013/10/05 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
应聘英语教师求职信
2014/04/24 职场文书
七年级语文教学反思
2016/03/03 职场文书
2019年教师入党申请书
2019/06/27 职场文书
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript