JS基础(事件的传播)

事件的传播
-关于事件的传播网景公司和微软公司有不同的理解
-微软公司认为事件应该是由内向外传播,也就是当事件触发时,应该先触发当前元素上的事件,
然后再向当前元素的祖先元素上传播,也就说事件应该在冒泡阶段执行。
-网景公司认为事件应该是由外向内传播的,也就是当前事件触发时,应该先触发当前元素的最外层的祖先元素的事件,
然后在向内传播给后代元素
-W3C综合了两个公司的方案,将事件传播分成了三个阶段

1.捕获阶段
-在捕获阶段时从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件
2.目标阶段
-事件捕获到目标元素,捕获结束开始在目标元素上触发事件
3.冒泡阶段
-事件从目标元素向他的祖先元素传递,依次触发祖先元素上的事件

-如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true
一般情况下我们不会希望在捕获阶段触发事件,所以这个参数一般都是false

捕获与冒泡传播效果:

        <style>
            .div1{
                 300px;
                height: 300px;
                background-color: red;
            }
            .div2{
                 200px;
                height: 200px;
                background-color: yellow;
            }
            .div3{
                 100px;
                height: 100px;
                background-color: blue;
            }
        </style>
        <script>
            window.onload=function(){
                var div1=document.querySelector('.div1')
                var div2=document.querySelector('.div2');
                var div3=document.querySelector('.div3');
                bind(div1,'click',function(){alert("div1");})
                bind(div2,'click',function(){alert("div2");})
                bind(div3,'click',function(){alert("div3");})
            }
            
            function bind(obj, eventstr, callback) {
                if (obj.addEventListener) {
                    //大部分浏览器兼容的方式
                    //如果把下面的false改为true将变成捕获阶段执行
                    //可以发现弹窗的顺序变了
                    obj.addEventListener(eventstr, callback, false);
                } else {
                    /*
                     *this是谁由调用方式决定
                     *callback.call(obj)
                     */
                    //IE8及以下
                    obj.attachEvent("on" + eventstr, function() {
                        //在匿名函数中调用回调函数
                        callback.call(obj);
                    });
                }
            }
        </script>
    </head>
    <body>
        <div class="div1">
            <div class="div2">
                <div class="div3"></div>
            </div>
        </div>
    </body>
原文地址:https://www.cnblogs.com/MDZZZ/p/12497451.html