博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript和jquery事件-鼠标移入移出事件
阅读量:4958 次
发布时间:2019-06-12

本文共 3405 字,大约阅读时间需要 11 分钟。

javascript使用mouseover和mouseout,只在css中支持hover

jquery支持mouseover和mouseout,封装了mouseenter、mouseleave事件函数和hover函数

1、有关js中的mouseover和mouseout

原生js的事件类型是mouserout和mouseover,之前提到的事件冒泡的缺陷就在这里,之前说的使用阻止冒泡就行,大概说得太轻易。来理一理它们的触发顺序吧。

 

如上dom结构,鼠标从body移入f1,再移入c1,然后移出c1、f1回到body,如果不做阻止冒泡处理一共触发了以下有关f1和c1事件:

  <1>起源于f1的 mouseover事件

  <2>起源自f1的mouseout事件

  <3>起源自c1的mouseover事件,这个事件会冒泡,触发f1的mouseover事件

  <4>起源自c1的mouseout事件,这个事件会冒泡,触发f1的mouseout事件

  <5>起源自f1的mouseover事件

  <6>起源自f1的mouseout事件

 

  可以看出,一是父元素鼠标移到子元素也会触发移入移出效果,二子元素移入移出的时候也会冒泡触发父元素监听器。

  如果给f1设置了监听器,我们就会触发6次监听器。

  但是,我们一般要用的效果是鼠标从body移入f1触发监听器—在f1里面移动(不要触发监听器)--鼠标从f1移出到body触发一次监听器(即常见的hover效果,上文六个事件只想触发第一个和最后一个)。这个效果在jq里面封装在mouseenter、mouseleave事件和hover()函数中。如果想要自己写的话可以使用阻止冒泡(很麻烦,需要关注到所有元素),或者自己在监听器中善用target(触发事件的元素),currentTarget(绑定监听器的元素),toElement和fromElement来判断。

  <1>当target!=curentTarget,可以过滤子元素触发的事件

  <2>移出事件,当toElement是父元素,可以判断是真正的移出

  <3>移入事件,当fromElement是父元素,可以判断是真正的移入

2、原生js实现hover效果

这只是其中一种方法,相关的分析上面已经说清楚了,因为我用的是谷歌和火狐,只做了兼容谷歌和火狐的版本,如果你的浏览器不支持,使用console,log(e)查看事件属性自己修改,或者换个方法,或者使用jquery封装好的函数都可。

方法一:这个bug比较多,下面方法二是改版

//********自定义的hover事件,兼容谷歌火狐            function hoverit(e){                var e = e||window.event||event;                var target = e.target||e.srcElement;                var curr = e.currentTarget||originalTarget;                if(target!=curr) return;//过滤子元素引起的事件                var relaElementto = e.toElement||e.relatedTarget;                var relaElementfr = e.fromElement||e.relatedTarget;                if(relaElementto==target.parentNode&&e.type=="mouseout"){
//移出事件 console.log(e.target.getAttribute('id')); //定义移出引发的事件 console.log('hover out'); } else if(relaElementfr==target.parentNode&&e.type=="mouseover"){
//移入事件 console.log(e.target.getAttribute('id')); //定义移入引发事件 console.log('hover in'); } } //********js的mouseover和mouseout document.getElementById('f1').οnmοuseοver=hoverit; document.getElementById('f1').οnmοuseοut=hoverit;
原生js实现hover事件效果

方法二:

//******用法:将该元素同时绑定在mouseover和mouseout事件上,并在注释位置定义自己的事件var showPicCommand = function(e){        var e = e||window.event||event;        var curr = e.currentTarget||originalTarget;//定义了hover事件的元素        var relaElementto = e.toElement||e.relatedTarget;//移出事件的目标        var relaElementfr = e.fromElement||e.relatedTarget;//移入事件的目标        if(!curr.contains(relaElementto)&&e.type=="mouseout"){
//移出事件,即,当移出的目标不是它的子元素中的任一个,我们就确定它的确是移出了 //定义移出引发的事件 console.log('hover out'); } else if(!curr.contains(relaElementfr)&&e.type=="mouseover"){
//移入事件,即,当移入的目标不是它的子元素中的任一个,我们就确定它的确是移入了 //定义移入引发事件 console.log('hover in'); } }
原生js实现hover

 

 

3、jquery事件

jquery支持mouseover和mouseout,效果和js的一样

//*********jquery也可以使用mouseover和mouseout$('#f2').on('mouseover',showit);$('#f2').on('mouseout',showit);

jquery自定义了mouseenter和mouseleave事件

//*********自定义的mouseenter和mouseleave$('#f2').on('mouseenter',showit);$('#f2').on('mouseleave',showit);

jquery封装了mouseenter()、mouseleave()函数,并将mouseenter和mouseleave事件监听器的绑定封装到hover函数中

//*********将mouseenter和mouseleave封装成hover$('#f2').hover(showit,showit);

 参考:

转载于:https://www.cnblogs.com/liwxmyself/p/10254143.html

你可能感兴趣的文章
(android实战)实现摇一摇功能
查看>>
python 中的map,dict,lambda,reduce,filter
查看>>
二、语言基础
查看>>
[恢]hdu 1030
查看>>
hihocoder-1142-三分求极值
查看>>
SNAT、DNAT、NPT
查看>>
git 10.8
查看>>
css实现div的高度填满剩余空间
查看>>
ES6(二) Destructuring-变量的解构赋值
查看>>
RestSharp.WindowsPhone调用Rest服务
查看>>
关于忘记Jenkins管理员密码的解决办法
查看>>
android 的四种枚举Context.MODE_PRIVATE
查看>>
网页javascript
查看>>
LDAP & implementation
查看>>
iOS - 类扩展与分类的区别
查看>>
AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking
查看>>
启动和停止Java应用程序的Shell脚本
查看>>
CSS选择器之兄弟选择器(~和+)
查看>>
[转]JAVA对象容器
查看>>
使用Spring Boot 和Spring Data JPA访问mysql数据库
查看>>