• Dom事件类-文档对象模型


    一, Dom事件的级别

    1. dom0
      事件的书写方式
        <div id="box">Dom0</div>
    </head>
    <body>
        <script>
            var dom0 = document.getElementById('box')   
            dom0.onclick = function() {
                console.log('dom1');  
            }
        </script>
    

    2.dom2事件的书写方式

      <div id="box">Dom2</div>
    </head>
    <body>
        <script>
            var dom2 = document.getElementById('box') 
            dom2.addEventListener('click', ()=>{
                console.log('dom2'); 
            })
        </script>
    

    3.dom3
    主要是在事件类型上加了很多

     <script>
            var dom3 = document
            dom3.addEventListener('keyup', ()=>{
                console.log('dom3'); 
            }, false)
        </script>
    

    dom1并没有对事件做修改

    二 事件流

    2.1 什么是事件流?
    事件流描述的是页面中接受事件的顺序,分为三个阶段: 捕获阶段--> 目标阶段--> 冒泡阶段

    例子:
    比如做一个点击事件,如何做到点击左键,再传到页面上的.

    捕获阶段: 从上往目标元素捕获 ---事件通过捕获到达目标元素
    目标阶段
    冒泡: 从目标元素往上冒泡----从目标元素上传到window

    2.2 事件捕获的具体流程
    捕获是从上到目标元素 (js怎么能拿到当前的html节点:document.documentElement)
    window -> document --> html --> body --> 目标元素

     <!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>
        <div id="box">测试捕获的顺序</div>
    </head>
    <body>
        <script>
            var box = document.getElementById('box')
            document.body.addEventListener('click', ()=> {
                console.log('body');
            }, true)
            window.addEventListener('click', ()=> {
                console.log('window');
            }, true)
            document.addEventListener('click', ()=> {
                console.log('document');
            }, true)
            box.addEventListener('click', ()=> {
                console.log('目标元素');
            }, true)
            document.documentElement.addEventListener('click', ()=> {
                console.log('html');
            }, true)
        </script>
    </body>
    </html>
    

    结果

    后面的传参数, false表示捕获, true是冒泡阶段,如果要测试冒泡,直接把顺序换过来.默认是冒泡。

    三, event 对象的常见应用
    3.1 e.preventDefault() --阻止系统默认行为

        <a href="https://www.baidu.com" id="box">点我</a>
    </head>
    <body>
        <script>
            // 阻止系统默认行为
            var box = document.getElementById('box')
            box.addEventListener('click', (e)=> {
               e.preventDefault()  
            })  
        </script>
    </body>
    

    3.2 e.stopPropagation() ---阻止冒泡

       <div id="father">father
            <div id="son">son</div>
        </div>
    </head>
    <body>
        <script>
            var father = document.getElementById('father')
            var son = document.getElementById('son')
            father.addEventListener('click', ()=> {
                console.log(1111);
            })
            son.addEventListener('click', (e)=> {
                console.log(2222);
                //加上之后不会冒泡到父元素了
                e.stopPropagation()
            })
        </script> 
    

    3.event.stopImmediatePropagation() --- 多个类似事件绑定在同一个元素,阻止事件冒泡,也阻止后面的事件的执行

    <!DOCTYPE html>
    <html>
        <head>
            <style>
                p { height: 30px;  150px; background-color: #ccf; }
                div {height: 30px;  150px; background-color: #cfc; }
            </style>
        </head>
        <body>
            <div>
                <p>paragraph</p>
            </div>
            <script>
                const p = document.querySelector('p')
                p.addEventListener("click", (event) => {
                    console.log("我是p元素上被绑定的第一个监听函数");
                }, false);
    
                p.addEventListener("click", (event) => {
                    console.log("我是p元素上被绑定的第二个监听函数");
                  event.stopImmediatePropagation();
                  // 执行stopImmediatePropagation方法,阻止click事件冒泡,并且阻止p元素上绑定的其他click事件的事件监听函数的执行.
                }, false);
                document.querySelector("div").addEventListener("click", (event) => {
                    console.log("我是div元素,我是p元素的上层元素");
                  // p元素的click事件没有向上冒泡,该函数不会被执行
                }, false);
                p.addEventListener("click",(event) => {
                    console.log("我是p元素上被绑定的第三个监听函数");
                  // 该监听函数排在上个函数后面,该函数不会被执行
                }, false);
            </script>
        </body>
    </html>
    
    1. e.target---触发事件的元素
      e.currentTarget --- 捕获的元素

    也可以说 e.target始终指向即当前点击的目标元素,e.currentTarget在事件委托中,如果监听元素不是目标元素,则指向监听元素
    e.currentTarget指向的是addEventListener 监听的那个元素, e.target是指向的目标元素,可以查看事件委托---https://www.cnblogs.com/antyhouse/p/12298932.html

        <div id="father">
            <div>1</div>
            <div id="second">2</div>
            <div>3</div>
        </div>
    </head>
    <body>
        <script>
            var box = document.getElementById('father')
            box.addEventListener('click', (e)=> {
                console.log('e.target',e.target);
                console.log('e.currentTarget',e.currentTarget);   
            })
            // event.currentTarget- 监听事件绑定的元素
            // event.target- 触发事件的元素。事件可能冒泡到父元素,随意触发事件的可能是父元素。
        </script>
    </body>
    

    四, 自定义事件

    <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>
        <div id="box">我就想自定义一个事件</div>
    </head>
    <body>
        <script>
            var custom = document.getElementById('box')
            var newEve = new Event('newEveName')
            custom.addEventListener('newEveName', ()=> {
                console.log('do somthing');
            })
            custom.dispatchEvent(newEve)
        </script>
        
    </body>
    </html>
    

    以及

    // 创建一个支持冒泡且不能被取消的look事件
    
    var ev = new Event("look", {"bubbles":true, "cancelable":false});
    document.dispatchEvent(ev);
    
    // 事件可以在任何元素触发,不仅仅是document
    myDiv.dispatchEvent(ev);
    
  • 相关阅读:
    MRC与ARC两种模式的相互兼容
    解决获取的手机序列号卸载应用重新安装时序列号变动的问题
    屏幕截图
    图片右下角显示水印
    在一个工程中建两个端口(司机端和货主端)
    左右侧边栏抽屉效果
    第二阶段第一天站立会议总结
    第十天站立会议总结
    第九天站立会议总结
    第八天站立会议总结
  • 原文地址:https://www.cnblogs.com/antyhouse/p/12295249.html
Copyright © 2020-2023  润新知