父元素onmouseover触发事件在父子元素间移动不停触发的问题
今天写了一个侧边栏动态展开收缩的效果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
body{ font-size: 20px;font-weight: bold;color: white;line-height: 30px;text-align: center}
.container{height: 347px;position: absolute;right: 0;border: 1px solid black}
.container li{position: relative;list-style: decimal;height: 30px;width: 200px;
margin-bottom: 3px;border: 1px solid black;display: list-item;right: -165px}
.container li::before{content: "";display: block;position: relative;
height: 30px;width: 35px;background: red} @keyframes bance {
0%{right: -165px}
100%{right:0 }
}
@keyframes bance1 {
0%{right:0 }
100%{right:-165px}
}
</style>
</head>
<body>
<div class="container">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</div>
<script> window.onload=function(){
var lilist=document.querySelectorAll('li');
var container=document.querySelector('.container');
var T1=null,T2=null; container.onmouseover=function(){
var n=0;
T1=setInterval(function(){
lilist[n].style.animationName='bance';
lilist[n].style.animationDuration='0.5s';
lilist[n].style.animationFillMode="forwards";
n++;
if(n>9){clearInterval(T1)}
},50)
}; container.onmouseout=function(){
var i=0;
T2=setInterval(function(){
lilist[i].style.animationName='bance1';
lilist[i].style.animationDuration='0.5s';
lilist[i].style.animationFillMode="forwards";
i++;
if(i>9){clearInterval(T2)}
},100)
} } </script>
</body>
</html>
执行过程中不断报错,仔细检查逻辑没有发现什么问题,百度之发现可能是父元素onmouseover触发事件在父子元素间移动不停触发的问题,着手解决吧。读完http://blog.sina.com.cn/s/blog_7488043d0101dnuz.html 这篇文章后知道了解决方法;
在onmouseover时先进行如下判断,结果为true时再执行方法体:
if(!this.contains(event.fromElement)){MouseOverFunc()}
在onmouseout时先进行如下判断,结果为true时再执行方法体:
if(!this.contains(event.toElement)){MouseOutFunc()}
下面来解释一下上面两行代码的含义:
在IE中,所有的HTML元素都有一个contains方法,它的作用是判断当前元素内部是否包含指定的元素。我们利用这个方法来判断外层元素的事件是不是因为内部元素而被触发,如果内部元素导致了不需要的事件被触发,那我们就忽略这个事件。
event.fromElement指向触发onmouseover和onmouseout事件时鼠标离开的元素;event.toElement指向触发onmouseover和onmouseout事件时鼠标进入的元素。
那么上面两行代码的含义就分别是:
○ 当触发onmouseover事件时,判断鼠标离开的元素是否是当前元素的内部元素,如果是,忽略此事件;
○ 当触发onmouseout事件时,判断鼠标进入的元素是否是当前元素的内部元素,如果是,忽略此事件;
这样,内部元素就不会干扰外层元素的onmouseover和onmouseout事件了。
添加判断后如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
body{ font-size: 20px;font-weight: bold;color: white;line-height: 30px;text-align: center}
.container{height: 347px;position: absolute;right: 0;border: 1px solid black}
.container li{position: relative;list-style: decimal;height: 30px;width: 200px;
margin-bottom: 3px;border: 1px solid black;display: list-item;right: -165px}
.container li::before{content: "";display: block;position: relative;
height: 30px;width: 35px;background: red} @keyframes bance {
0%{right: -165px}
100%{right:0 }
}
@keyframes bance1 {
0%{right:0 }
100%{right:-165px}
}
</style>
</head>
<body>
<div class="container">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</div>
<script> window.onload=function(){
var lilist=document.querySelectorAll('li');
var container=document.querySelector('.container');
var T1=null,T2=null; container.onmouseover=function(){
if(!this.contains(event.fromElement)){
var n=0;
T1=setInterval(function(){
lilist[n].style.animationName='bance';
lilist[n].style.animationDuration='0.5s';
lilist[n].style.animationFillMode="forwards";
n++;
if(n>9){clearInterval(T1)}
},50)
}
}; container.onmouseout=function(){
if(!this.contains(event.toElement)){
var i=0;
T2=setInterval(function(){
lilist[i].style.animationName='bance1';
lilist[i].style.animationDuration='0.5s';
lilist[i].style.animationFillMode="forwards";
i++;
if(i>9){clearInterval(T2)}
},100)
}
}; } </script>
</body>
</html>
没有问题。。
父元素onmouseover触发事件在父子元素间移动不停触发的问题的更多相关文章
- target属性用于返回最初触发事件的DOM元素。
target属性用于返回最初触发事件的DOM元素. 在HTML文档中,我们为<p>元素绑定点击事件("click"),由于DOM元素的事件冒泡机制,我们点击<p& ...
- 解决内部元素onMouseOver/onMouseOut事件冒泡触发父元素的相应事件
前阵子为BS项目模板做了一个左侧滑动信息栏,效果类似于windows状态栏的自动隐藏效果,鼠标移进滑出,鼠标移出隐藏,浮动时不占用空间,也可以固定住占一块位置.做的过程中遇到一个问题,鼠标在信息栏内部 ...
- js中点回车enter触发事件&layui弹窗按enter键不停弹窗问题的解决&js实现鼠标焦点自动落到文本框(layui)
js中回车触发事件 一. document.onkeydown = function (e) { // 回车提交表单 // 兼容FF和IE和Opera var theEvent = window.e ...
- js实现文本框或文本域在用户输入时(oninput)触发事件,操作元素
写在前面:给不同的文本框设定同样的效果,当文本框没有内容输入时,‘下一步’按钮不可用且透明度为0.5.当有内容输入时(并不是获得焦点时focus),‘下一步’按钮状态可用, 且透明度为1. <s ...
- 触发bfc解决父子元素嵌套垂直方向margin塌陷问题
首先看一下问题案例 .wrapper{ width: 100px; height: 100px; background-colo ...
- jquery实现input输入框实时输入触发事件代码(点击历史记录也会触发)
$("#email").bind('input propertychange', function() { if(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0 ...
- js阻止浏览器、元素的默认事件与js阻止事件冒泡、阻止事件流
嵌套的div元素,如果父级和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下js阻止默认事件与js阻止事件冒泡示例,大家参考使用吧 1. event.prev ...
- js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件
js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件 一.总结 一句话总结:event.type 描述事件的类型. event.target 触发该事件的 DOM 元素. ...
- jQuery on() 方法 为选定已存在元素和未来元素绑定标准事件和自定义事件
很有必要说说jQuery的on方法,这个方法存在大乾坤大奥秘,主要注意两点: 1.为已存在元素和未来元素(动态添加元素)绑定处理函数. 2.自定义一个非标准的事件并绑定处理函数. 定义和用法 on() ...
随机推荐
- CVTE公司面经
1.先是网上测评,通过后通知你参加一面. 2.关于一面:一共进行了10分钟左右,三四个人一起面,没有问什么技术. 一共问了3个问题:a.你为什么选择我们公司的这个职位.我答的大概意思是本科研究生期间, ...
- VS2010 Chromium编译
推荐使用Windows 7及以后系统,最少8G内存,预留出50G磁盘空间 搭建Visual Studio 2010开发环境 1.安装Visual Studio 2010专业版或者旗舰版 2.安装VS2 ...
- How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu
sudo apt-get update sudo apt-get install nginxsudo mkdir -p /var/www/example.com/html sudo chown -R ...
- 用js将毫秒时间转成正常时间
1. 将毫秒时间转成正常时间 //#region 将毫秒转换成正常的日期 function getDate(time) { var date = new Date(parseInt(time)); v ...
- windows内核窥探
windows是一个非常优秀的OS,从今天开始,我要和大家共同分享windows给我们带来的快乐!本人只所以将自己的学习笔记与大家分享,一是让自己更深入的理解windows,再就是有什么疏漏之处,望大 ...
- 分享一个安卓中异步获取网络图片并自适应大小的第三方程序(来自github)
安卓中获取网络图片,生成缓存 用安卓手机,因为手机流量的限制,所以我们在做应用时,要尽量为用户考虑,尽量少耗点用户的流量,而在应用中网络图片的显示无疑是消耗流量最大的,所以我们可以采取压缩图片或者将图 ...
- FZU 2176 easy problem (DFS序+树状数组)
对于一颗树,dfs遍历为每个节点标号,在进入一个树是标号和在遍历完这个树的子树后标号,那么子树所有的标号都在这两个数之间,是一个连续的区间.(好神奇~~~) 这样每次操作一个结点的子树时,在每个点的开 ...
- 异步网页采集利器CasperJs
在采集网页中,我们会经常遇到采集一些异步加载页面的网页,我们通常用的httpwebrequest类就采集不到了,这个时候我们通常会采用webbrowser来辅助采集,但是.net下自带的webbrow ...
- [Objective-c 基础 - 1.1] OC类
Obj-C中没有包得概念,使用前缀进行区分 自带类用NS开头命名 关键字使用@开头 A. 第一个OC程序 1. 导入Foundation框架的主头文件 #import <Foundation ...
- rank() | dense_rank() | row_number() over(PARTITION BY sex order by age desc ) 的区别
1.row_num() over()函数:根据某个字段排序后编号1,2,3.. select *,ROW_NUMBER() over ( order by majorid) as numfrom St ...