• 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>
  • 相关阅读:
    day 50 jquery之看我操作
    day 49 JavaScript中BOM和DOM
    day 43 CSS前端
    day 42 前端HTML
    day 41 mysql索引以及前端的简介
    day 40 mysql 之视图,触发器,事务,存储过程及函数
    day 39数据库mysql之多表查询
    day 38 数据库MySQL之单表查询
    day 37 数据库MySQL基本操作
    39套漂亮的后台模板
  • 原文地址:https://www.cnblogs.com/MDZZZ/p/12497451.html
Copyright © 2020-2023  润新知