美文网首页
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)

    7.事件深入 #7.1.事件捕获 事件流分为事件冒泡和事件捕获两种,事件冒泡指事件从里往外传播,而事件捕获刚好相反...

  • DOM-BOM-EVENT(2)

    2.获取DOM元素的方法 #2.1.getElement系列 documentElementById 通过id获取...

  • DOM-BOM-EVENT(1)

    1.DOM简介 DOM(Document Object Model)即文档对象模型,是HTML和XML文档的编程接...

  • DOM-BOM-EVENT(3)

    3.Node常用属性 childNodes 获取所有子节点 children 获取所有子节点中的元素节点 firs...

  • DOM-BOM-EVENT(4)

    4.dom操作 createElement 创建一个元素 appendChild() 在最后添加一个子元素 ins...

  • DOM-BOM-EVENT(5)

    5.宽、高、位置相关 #5.1.clientX/clientY clientX和clientY表示鼠标在浏览器可视...

  • DOM-BOM-EVENT(6)

    6.BOM #6.1.什么是BOM? BOM(Browse Object Model),浏览器对象模型,没有相关标...

  • 【第三周检视】2017.06.04—2017.06.10

    一、一周好习惯 早起7∕7,早睡7∕7,走步6∕7,冥想7∕7,八段锦5∕7,群里打卡7∕7,英语7∕7,读书群7...

  • 易效能时间管理8组小组会议第十周

    打卡统计:许丽钦 7/7;刘佼佼7/7;佟创5/7;万森7/7;乐天6/7;绍斌4/7;黎钦财7/7; 本周学习收...

  • 7/7

    我不能夸口说精神分析从来不做琐碎的事情,事实恰恰相反,精神分析所观察的材料常被其他科学讥讽为是琐碎、平凡和不重要的...

网友评论

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

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