javascript鼠标移入移出事件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript鼠标移入移出事件相关的知识,希望对你有一定的参考价值。
鼠标移入1级菜单后,弹出2级菜单,鼠标移出1级菜单后,2级菜单被隐藏——鼠标移入2级菜单后,显示2级菜单,鼠标移出2级菜单后,2级菜单被隐藏。求解决鼠标移出1级菜单,还没有移入2级菜单的情况下,2级菜单自动隐藏的问题。
两种办法:2级菜单要紧挨着1级菜单,至少有一部分是相连的,这样鼠标沿着相连的部分移动,就不会让2级菜单自动隐藏了;或者在1级菜单的mouseout事件中,不要立刻让2级菜单隐藏,而是延迟一段时间再隐藏,比如 var t = setTimeout("2级菜单.style.display='none'",1000); ,这样的话,只要在1秒内鼠标移到2级菜单上即可,当然,2级菜单的mouseover事件要立刻执行 clearTimeout(t);。特别注意:变量t一定要设为全局的。 参考技术A你要鼠标移出后1级菜单后2级菜单隐藏,又要鼠标移出1级菜单后移入2菜单前不隐藏
但是你的一级菜单和二技菜单还不是连在一起 这个逻辑就本身有问题
要实现你说的内容 方法有两个
1、修改排版 把一级菜单和二技菜单连在一起
2、对”鼠标移出后1级菜单后2级菜单隐藏”这个操作进行延时处理,示例
<html>
<HEAD>
<style>
.menu1 color:red;background:yellow;
.menu2_hide color:blue;display:none;
.menu2_show color:blue;background:red;
</style>
</HEAD>
<BODY>
<span id='menu1' class='menu1'>menu1</span>
<span id='menu2' class='menu2_hide'>menu2</span>
<SCRIPT LANGUAGE="javascript">
<!--
var timer;
document.getElementById('menu1').onmouseover=function()
document.getElementById('menu2').className='menu2_show'
;
document.getElementById('menu1').onmouseout =function()
timer = setTimeout("document.getElementById('menu2').className='menu2_hide';",200);
;
document.getElementById('menu2').onmouseover=function()
clearTimeout(timer);
document.getElementById('menu2').className='menu2_show'
;
document.getElementById('menu2').onmouseout =function()
document.getElementById('menu2').className='menu2_hide'
;
//-->
</SCRIPT>
</BODY>
</HTML> 参考技术B 要么就hover的时候增加width来连接二级菜单
要么就二级菜单加个底层背景.大小可以接上一级菜单 不过只有右边可以离开二级菜单时隐藏了
或者做成点击事件.直接解决
javascript父级鼠标移入移出事件中的子集影响父级的处理方法
一、我们先分析其产生的原因:
1、当鼠标从父级移入子集时触发了父级的两个事件:a、父级的mouseout事件(父级离开到子集);b、由于事件冒泡影响,又触发了父级的mouseover事件(父级移入父级);
2、当鼠标从子集移出到父级时又触发了父级的两个事件:a、由于事件冒泡影响,父级触发了mouseout事件(父级移出父级);b、再触发了父级的mouseover事件(子集移入父级)
注:红色字体的解释是事件冒泡的奇妙之处。
二、解决方法:
首先必须先熟悉以下两个方法和一个事件属性:
a,b为节点
1、a.contains(b)
如果a包含b,返回true;否则返回false;a包含a同样返回true(不兼容火狐)
2、 a.compareDocumentPosition(b) 兼容火狐
这玩意就好玩了:
a在b之后返回2;
a在b之前返回4;
a被b包含返回8;
a包含b返回16;
a包含a返回0;
3、ev.relatedTarget
返回事件的目标节点相关的节点;
对于 mouseover 事件来说,该属性是鼠标指针移到目标节点上时所离开的那个节点。
对于 mouseout 事件来说,该属性是离开目标时,鼠标指针进入的节点。(IE9以下不兼容)
但IE7/8下有ev.toElement和ev.fromElement;
mouseover事件对应ev.fromElement
mouseout事件对应ev.toElement
接下来开始解决问题:
假设a是父级;b是与事件关联的节点:
解决原因1:
方法(1)a包含b返回true,a包含a返回true;
方法(2)a移出b(mouseout)返回4+16即返回20;a移入a(mouseover)返回0;
解决原因2:
方法(1)a包含a返回true,a包含b返回true
方法(2)a移出a返回0,b移入a返回4+16即返回20;
要让以上都不执行:
见代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>解决子集影响父级事件</title> <style type="text/css"> body { width: 100%; height: 100%; padding: 0; margin: 0;} #div1 { width: 200px; height: 200px; background: red; } #div2 { width: 100px; height: 100px; background: blue;position: absolute; top: 50px; left: 50px;} #txt { width: 800px; background: lime; color: red; height: 50px; line-height: 50px; font-size: 30px} </style> <script> window.onload=function(){ var oTxt = document.getElementById(\'txt\'); var a = document.getElementById(\'div1\'); var b = document.getElementById(\'div2\'); alert(b) a.onmouseover=function(ev){ var oEvent = ev || window.event; if(toAffect(a,oEvent,\'mouseover\')){ oTxt.value += "移入"+" "; } } a.onmouseout=function(ev){ var oEvent = ev || window.event; if(toAffect(a,oEvent,\'mouseout\')){ oTxt.value += "移出"+" "; } } } function toAffect(obj1,ev,event){ var obj2 = null; if(ev.relatedTarget){ obj2 = ev.relatedTarget; } else{ if(event == \'mouseover\'){ obj2 = ev.fromElement; } else if(event == \'mouseout\'){ obj2 = ev.toElement; } } if(obj1.contains){ return !obj1.contains(obj2); } else{ return !!(obj1.compareDocumentPosition(obj2)-20)&&a!=b; } } </script> </head> <body> <div id="div1"> 父级 <div id="div2">子集</div> </div> <input id="txt" type="text" /> </body> </html>
代码中的toAffect方法便是解决子集影响父级的方法。
以上是关于javascript鼠标移入移出事件的主要内容,如果未能解决你的问题,请参考以下文章
javascript父级鼠标移入移出事件中的子集影响父级的处理方法
CSS之hover的使用和鼠标移入移出事件的区别addEventListenermouseentermouseleavequerySelectorsplit+~