美文网首页
DOM-BOM-EVENT(7)

DOM-BOM-EVENT(7)

作者: 螺钉课堂 | 来源:发表于2019-12-18 09:52 被阅读0次

    7.事件深入

    #7.1.事件捕获

    事件流分为事件冒泡和事件捕获两种,事件冒泡指事件从里往外传播,而事件捕获刚好相反,指事件从外向內传播

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            #box1{
                width: 600px;
                height: 400px;
                background-color: black;
                margin: 100px auto;
                border: 1px solid
            }
            #box2{
                width: 400px;
                height: 200px;
                margin: 100px auto;
                background-color: orangered;
                border: 1px solid
            }
            #box3{
                width: 200px;
                height: 100px;
                margin: 50px auto;
                background-color: #009f95
            }
        </style>
    </head>
    <body>
        <div id="box1">
            <div id="box2">
                <div id="box3"></div>
            </div>
        </div>
        <script>
            var oBox1 = document.getElementById("box1")
            var oBox2 = document.getElementById("box2")
            var oBox3 = document.getElementById("box3")
    
            function fn(){
                alert(this.id)
            }
    
            oBox1.onclick = fn;
            oBox2.onclick = fn;
            oBox3.onclick = fn;
    
            // 事件绑定的另外一种形式
            // addEventListener 第一个参数是 事件名称,第二个参数是事件处理函数,第三个参数表示 是否捕获
            // true表示捕获  false表示不捕获,捕获就是冒泡
            // 下面是事件冒泡的写法
            // oBox1.addEventListener('click',fn,false)
            // oBox2.addEventListener('click',fn,false)
            // oBox3.addEventListener('click',fn,false)
            // 下面是事件捕获的写法
            oBox1.addEventListener('click',fn,true)
            oBox2.addEventListener('click',fn,true)
            oBox3.addEventListener('click',fn,true)
    
        </script>
    </body>
    </html>
    
    

    #7.2.事件绑定形式总结

    • 第一种写法,直接绑定在元素身上
     <div id="box" onclick="fn(this)"></div>
    <script>
        function fn(obj){
            alert(obj.id)
        }
    </script>
    
    
    • 第二种写法 对象.事件 = 事件处理函数
     <div id="box" ></div>
    <script>
        var oBox = document.getElementById("box")
        oBox.onclick = function(){
            alert(this.id)
        }
    </script>
    
    

    注意: 这种写法有个问题就是,如果同时绑定两个事件处理函数,后面的会把前面的覆盖,例如:

     <div id="box" ></div>
    <script>
        var oBox = document.getElementById("box")
        oBox.onclick = function(){
            alert(this.id)
        }
        oBox.onclick = function(){
            alert("nodeing.com")
        }
    </script>
    
    
    • 第三种写法:addEventListener
    <div id="box" ></div>
    <script>
        var oBox = document.getElementById("box")
    
        oBox.addEventListener("click", function(){
            alert(this.id)
        }, false)
    
        oBox.addEventListener('click', function(){
            alert("nodeing.com")
        }, false)
    
    </script>
    
    

    注意:这种写法在ie上有兼容性问题,因此,可以封装一个兼容性处理函数

    function addEvent(obj, type, fn){
        if(obj.addEventListener){
            obj.addEventListener(type, fn, false);
        } else if(obj.attachEvent){
            obj.attachEvent('on' + type, fn);
        } else {
            obj['on' + type] = fn;
        }
    }
    
    

    #7.3.事件取消

    function removeEvent(obj, type, fn){
        if(obj.removeEventListener){
            obj.removeEventListener(type, fn, false);
        } else if(obj.detachEvent){
            obj.detachEvent('on' + type, fn);
        } else {
            obj['on' + type] = null;
        }
    }
    
    

    #7.4.事件默认行为

    • 如果是通过 对象.onclick = fn 这种形式来绑定的, 可以直接在事件处理函数中return false来取消
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            #box{
                height: 200px;
                width: 100px;
                background-color: orangered;
                position: absolute;
                display: none
            }
        </style>
    </head>
    <body>
        <div id="box" ></div>
        <script>
            var oBox = document.getElementById("box")
            document.oncontextmenu = function(ev){
                var ev = ev || event
                oBox.style.display = "block"
                oBox.style.left = ev.clientX + "px"
                oBox.style.top = ev.clientY + "px"
                // 取消事件默认行为
                return false
            }
    
            document.onclick = function(){
                oBox.style.display = "none"
            }
    
        </script>
    </body>
    </html>
    
    
    • 如果是通过addEventListener这种形式来绑定的,需要通过 ev.preventDefault()这种形式来取消
    document.addEventListener("contextmenu", function(ev){
        var ev = ev || event
        oBox.style.display = "block"
        oBox.style.left = ev.clientX + "px"
        oBox.style.top = ev.clientY + "px"
        // return false
        ev.preventDefault()
    }, false)
    
    

    相关文章

      网友评论

          本文标题:DOM-BOM-EVENT(7)

          本文链接:https://www.haomeiwen.com/subject/rzpynctx.html