zoukankan      html  css  js  c++  java
  • mouseover和mouseout事件引发的BUG-解决方法

    mouseover和mouseout引发的BUG原由

    当给一个元素添加mouseover或mouseout事件,这个元素还有子元素。

    由于子元素的事件冒泡,鼠标移入或移出子元素都会触发事件。

    解决的方法:根据event对象判断是否为子元素

    JQuery解决方法

    JQuery可以用mouseenter代替mouseover,mouseleave代替mouseout。

    还可以用hover()方法。

    JavaScript原生解决方法

    原生的方法解决就需要了解一下relatedTarget、fromElement、toElement这三个event返回的对象。

    relatedTarget是w3c标准的ie没有/fromElement在ie时mouseover使用/toElement在ie时mouseout上使用

    写一下简单的思路:

    鼠标移入的时候判断一下:移入的元素既不是本身,也不是元素的子节点,然后触发事件。

    写了两个方法:

    relatedTarget()  //返回相关元素的节点

    checkFather(obj,relatedTarget)  //判断移入的元素既不是本身 也不是元素的子节点

    在发个示例:

    <!DOCTYPE>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>box</title>
    <style>
        #box{position: absolute;top:20px;left:45px;background-color: red; 400px;height: 400px;}
        #box p{background-color: #000;color: #fff;}
        #box p span{background-color: #fff;color: #000;}
    </style>
    </head>
    <body>
    
    <div id="box">
        <p>g.com.cn/touch/js/jquery-1.8.3.mispan <span>spanspan</span> ng.com.cn/touch/js/jquery-1.8.3.ming.com.cn/touch/js/jquery-1.8.3.min</p>
        <p>g.com.cn/touch/js/jquery-1.8.3.ming.com.cn/touch/js/jquery-1.8.3.ming.com.cn/touch/js/jquery-1.8.3.min</p>
    </div>
    
    
    <script>
    document.getElementById('box').onmouseover = function(event){
        var event = event || window.event;
        if(checkFather(this, relatedTarget(event,'mouseover'))){
            alert('mouseover');
        }
    }
    document.getElementById('box').onmouseout = function(event){
        var event = event || window.event;
        if(checkFather(this, relatedTarget(event,'mouseout'))){
            alert('onmouseout');
        }
    }
    
    /*
        返回相关元素的节点
        event,'mouseover' or 'mouseout'
    */
    function relatedTarget(event,method){
        if(arguments.length<2) throw new Error('relatedTarget()缺少参数');
        if(event.relatedTarget) return event.relatedTarget;
        
        if(method == 'mouseover'){
            return event.fromElement;
        }else if(method == 'mouseout'){
            return event.toElement;
        }else{
            throw new Error('relatedTarget(method)错误');
        }
    }
    
    //判断移入的元素既不是本身 也不是元素的子节点
    function checkFather(obj,relatedTarget){
         return obj!=relatedTarget && !obj.contains(relatedTarget);
    }
    </script>
    
    </body>
    </html>
  • 相关阅读:
    An internal error occured during :"C/C++" . java.lang.NullPointerException
    链接目标文件提示对象重定义解决方法
    cocos2d Slider 透明滑动部件无法生成解决办法
    cocos2d 艺术标签没有显示
    cocos2d项目 打包apk 项目名称相关设置
    cocos2d-x 3.2 listview scorllview 等容器在小米华为等部分手机显示泛白解决
    Linux发行版的系统目录名称命名规则以及用途
    Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
    复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的 行首的空白字符
    在vim中设置tab缩进为4个字符
  • 原文地址:https://www.cnblogs.com/dtdxrk/p/3654215.html
Copyright © 2011-2022 走看看