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

总结: 当同一个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_冒泡
 

原文地址:https://www.cnblogs.com/tianzhongshan/p/14667709.html