父元素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>

没有问题。。

时间: 2024-08-28 02:33:52

父元素onmouseover触发事件在父子元素间移动不停触发的问题的相关文章

解决内部元素onMouseOver/onMouseOut事件冒泡触发父元素的相应事件

前阵子为BS项目模板做了一个左侧滑动信息栏,效果类似于windows状态栏的自动隐藏效果,鼠标移进滑出,鼠标移出隐藏,浮动时不占用空间,也可以固定住占一块位置.做的过程中遇到一个问题,鼠标在信息栏内部移动时会触发onMouseOut事件,信息栏放在div中,内部有table.img.a等元素,看来是由于事件冒泡,子元素上触发了事件冒泡到了父元素,导致滑动时不断闪动,头晕眼花,于是着手解决问题. 方法一: 在IE下解决问题很简单,用onMouseEnter.onMouseLeave来代替onMou

解决HTML元素的Mouse事件被内部元素的干扰

有一个DIV元素,其内部SPAN元素, 为了实现一些特殊的效果,我需要利用DIV元素的onmouseover和onmouseout事件,测试时就会发现如下的状况: 当鼠标移入DIV内部时,onmouseover事件被触发:接着再鼠标移动到DIV内部SPAN元素之上,我们肯定不会认为这时鼠标已经移到了DIV的外边,但奇怪的是DIV元素的onmouseout事件触发了,而且紧接着DIV元素onmouseover事件也马上被触发了. 这可不是我想要的,那么怎么来"屏蔽"内部元素给外层元素带来

触发bfc解决父子元素嵌套垂直方向margin塌陷问题

首先看一下问题案例 .wrapper{ width: 100px; height: 100px; background-color: aqua; margin-top: 100px; margin-left: 100px; } .inner{ width: 50px; height: 50px; margin-top: 100px; margin-left: 50px; background-color:black; } <div class="wrapper"> <

js阻止浏览器、元素的默认事件与js阻止事件冒泡、阻止事件流

嵌套的div元素,如果父级和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下js阻止默认事件与js阻止事件冒泡示例,大家参考使用吧 1. event.preventDefault();  -- 阻止元素的默认事件.注:a元素的点击跳转的默认事件 , button,radio等表单元素的默认事件 , div 元素没有默认事件 例: 复制代码代码如下: <a href="http://www.baidu.com" target="_bl

jquery 元素绑定on事件

在选择元素上绑定一个或多个事件的事件处理函数. on()方法绑定事件处理程序到当前选定的jQuery对象中的元素.在jQuery 1.7中,.on()方法 提供绑定事件处理程序所需的所有功能.帮助从旧的jQuery事件方法转换,see .bind(), .delegate(), 和 .live(). 要删除的.on()绑定的事件,请参阅.off(). 参数 events,[selector],[data],fnV1.7 events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click

jQuery on() 方法 为选定已存在元素和未来元素绑定标准事件和自定义事件

很有必要说说jQuery的on方法,这个方法存在大乾坤大奥秘,主要注意两点: 1.为已存在元素和未来元素(动态添加元素)绑定处理函数. 2.自定义一个非标准的事件并绑定处理函数. 定义和用法 on() 方法在被选元素及子元素上添加一个或多个事件处理程序. 自 jQuery 版本 1.7 起,on() 方法是 bind().live() 和 delegate() 方法的新的替代品.该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库. 注意:使用 on() 方法添加的

H5_0038:父元素有touch事件,子元素有点击事件,如何实现点击事件

移动端父元素绑定touch事件,子元素绑定click事件 一.问题描述 碰到一个非常头疼的问题,为了做一个滑动效果,给li标签绑定了touch事件.滑动之后,li标签的末尾会出现一个删除按钮,然后点击该删除按钮,删除整个li标签. 看起来没什么问题吧,实际上暗藏杀机啊.给删除按钮绑定点击事件的时候,并没有执行点击事件,而是先执行了父元素,也就是li标签的touch事件. 那怎么解决呢? 最开始想到的是,click事件应该设置成冒泡阶段执行,在设置个阻止冒泡,这样不就不会触发父元素的touch事件

input _文本框回车或者失去光标触发事件

IE下,当一个HTML元素的属性改变的时候,都能通过 onpropertychange来即时捕获. onchange在属性值改变时还必须使得当前元素失去焦点(onblur)才可以激活该事件. 了解这一点后我们发现onpropertychange的效果就是我们想要的,可是很遗憾,它只在IE下有效果.我们能不能找到另外一个时间来代替onpropertychange呢? 经过翻阅资料得知,在其他浏览器下可以使用oninput事件来达到同样的效果,真是太好了,我们只需要把IE浏览器区分出来就可以. 如果

关于Input内容改变的触发事件

1.onchange onchange 事件会在域的内容改变时触发.支持的标签<input type="text">, <textarea>, <select>,<keygen>. 注意:在元素的值改变了且失去焦点时触发(两次的值一样不会触发). 缺陷:通过js代码改变DOM的值不会触发,解决在js代码里改值了调用其change 的function() 或者调.change()方法. JS: 1 <input type="