• 事件冒泡、事件捕获、事件委托


    总结: 当同一个Dom节点既注册了捕获阶段事件,又注册了冒泡阶段事件,会先执行捕获阶段事件后,后执行冒泡阶段事件。
     
    事件捕获: 是指自上而下的顺序,从document开始执行事件到触发事件的Dom节点。
    (初期:Netscape(网景)只使用事件捕获)
    事件冒泡: 是指自下而上的顺序,从触发事件的Dom节点开始执行事件到document。
    (初期:Internet Explorer只使用事件冒泡)
    事件委托: 是指利用事件冒泡的机制,在触发事件的Dom节点的上层节点(如:父级节点)进行事件绑定委托上层节点进行事件处理,可以达到减少同一类型节点单个绑定事件时内存空间占用,并使当前类型节点可以动态添加减少不用额外添加或减少绑定事件。
     
    EventTarget.addEventListener(type,listener,useCapture) 
    将指定的监听器注册到 EventTarget 上,当该对象触发指定的事件时,指定的回调函数就会被执行。
    IE9之前使用 attachEvent 绑定事件兼容
    注:第三个参数useCapture可以是一个options具体可以查看MDN
    type: 监听事件类型字符串。(如: click, 注:不需要写 "on")
    listener: 监听事件类型触发时执行函数。
    useCapture:表示监听事件类型触发条件,即在什么阶段触发。默认false,在冒泡阶段触发,当设置为true时,执行函数只在捕获阶段触发。
     
    event.stopPropagation:阻止捕获和冒泡阶段当前事件进一步的传播。不能防止默认任何行为发生。
    event.preventDefault: 如果此事件没有被显示处理,默认的动作也不执行,事件继续传播。即阻止事件默认行为,不能防止显示处理任何行为发生。
     
    借用网上实例并修改部分,忘记是那个网址,见谅
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Document</title>
        <style>
            #outer{
                text-align: center;
                 400px;
                height: 400px;
                background-color: #ccc;
                margin: 0 auto;
            }
            #middle{
                 250px;
                height: 250px;
                background-color: #f00;
                margin: 0 auto;
            }
            #inner{
                 100px;
                height: 100px;
                background-color: #0f0;
                margin: 0 auto;
                border-rad
            }
        </style>
    </head>
    <body>
        <div id='outer'>
            <span>outer</span>
            <div id='middle'>
                <span>middle</span>
                <div id='inner'>
                    <span>inner</span>
                </div>
            </div>
        </div>
        <script>
            function $(element){
                return document.getElementById(element);
            }
            function on(element,event_name,handler,use_capture){
                console.log('只执行一次判断')
                if(addEventListener){
                    on = function(element,event_name,handler,use_capture){
                        console.log('直接执行addEventListener')
                        $(element).addEventListener(event_name,handler,use_capture);    
                    }
                }else{
                     on = function(element,event_name,handler,use_capture){
                        console.log('直接执行addEventListener')
                        $(element).attachEvent('on'+event_name,handler);
                    }
                }
            }
    
            on("outer","click",o_click_c,true);
            on("middle","click",m_click_c,true);
            on("inner","click",i_click_c,true);
    
            on("outer","click",o_click_b,false);
            on("middle","click",m_click_b,false);
            on("inner","click",i_click_b,false);
            
            function o_click_c(){
                console.log("outer_捕获")
            }
            function m_click_c(e){
                e.preventDefault()
                console.log("middle_捕获")
            }
            function i_click_c(){
                console.log("inner_捕获")
            }
            function o_click_b(){
                console.log("outer_冒泡")
            }
            function m_click_b(e){
                e.stopPropagation()
                console.log("middle_冒泡")
            }
            function i_click_b(){
                console.log("inner_冒泡")
            }
        </script>
    </body>
    </html>
    // 输出
    // a.html:63 outer_捕获
    // a.html:67 middle_捕获
    // a.html:70 inner_捕获
    // a.html:80 inner_冒泡
    // a.html:77 middle_冒泡
     

  • 相关阅读:
    Python标准库:内置函数dict(**kwarg)
    如何把 excel 的数据导入到数据库里面去
    正在载入数据中效果
    站点公司亚马逊砸了10亿也没能做成智能手机,技术是须要沉淀和积累的
    零积分下载,2014年辛星mysql教程秋季版第一本已经完工,期待您的支持
    【C语言】在两个数成对出现的数组中找到一个单独的数。
    3.跟我学solr---使用solrj加入索引
    使用CAShapeLayer的path属性与UIBezierPath画出扫描框
    UI设计四要素
    swift 工作日志
  • 原文地址:https://www.cnblogs.com/tianzhongshan/p/14667709.html
Copyright © 2020-2023  润新知