事件的传播机制

一、事件的传播机制

以点击事件为例

<div id="outer">
    <div id="inner">
        <div id="center">

        </div>
    </div>
</div>

<script>
    //4.事件的传播机制
    //事件的默认传播机制:
    //分为三个阶段:
    //捕获阶段:从外向内依次查找元素
    //目标阶段:当前事件源(当前触发的这个元素)本身的操作
    //冒泡阶段:从内到外依次触发相关的行为

    //我们最常用的就是冒泡阶段

    var outer = document.getElementById("outer"),
        inner = document.getElementById("inner"),
        center = document.getElementById("center");
    // document.body.onclick = function (e) {
    //     console.log("body");
    // };
    // outer.onclick = function (e) {
    //     console.log("outer");
    // };
    // inner.onclick = function (e) {
    //     console.log("inner");
    // };
    // center.onclick = function (e) {
    //     console.log("center");
    // };

    //center.onclick = function () {];  叫DOM0级事件绑定
    //DOM0级事件绑定的方法,都是在冒泡阶段执行的方法
    //用DOM0级事件绑定,给元素的某一个行为绑定的方法,都是在行为触发后的
    //冒泡阶段把方法执行的

    //什么叫做冒泡阶段?
    //第一阶段,当前center的click行为被触发,如果给其绑定了方法,首先把center对应的方法执行。(这是目标阶段完成的)
    //第二阶段,不仅仅center的click行为被触发了,它所有父级元素的click行为也会被触发。
    //接下来是inner的click行为被触发,如果给inner也绑定了方法,inner对应的方法也会执行。
    //接下来是outer的click行为被触发,如果给outer也绑定了方法,outer对应的方法也会执行。
    //同理依次查找 outer, body, html, document

    //注意:每个浏览器传播到的最顶层是不一样的,谷歌中可以传播到document,但是在IE中只能
    //传播到html
    //我们平常只会用到body这一层

    //e目前是鼠标事件对象
    //输出四次 MouseEvent


    //怎么控制让它在捕获阶段完成呢?
    //在捕获阶段完成,只能使用DOM2级事件绑定,addEventListener这个方法去完成
    //第一个参数是行为的类型,第二个参数是给当前的行为绑定的方法
    //行为触发的时候,会执行这个方法,这个方法也可以使用e,浏览器都会传一个e进来
    //第三个参数是控制在哪个阶段发生:true在捕获阶段发生,false就是在冒泡阶段发生
    //写false,说明这个方法,是在冒泡阶段发生
    document.body.addEventListener("click", function (e) {
        console.log("body");
    }, false);

    //写true,表示在捕获阶段执行
    //捕获阶段的,先执行
    //因为执行顺序是先捕获,再目标,然后再冒泡
    //捕获阶段是,从外向内依次查找,只有outer是控制在捕获阶段的
    //1.首先捕获阶段,先找document,看是否给它绑定方法,再找html,也没有给它绑定方法,
    //然后再找body,也没有在捕获阶段给它绑定方法,然后再找outer,在捕获阶段绑定了一个方法,
    //输出"outer",然后找到inner,没有绑定方法,最后找到center,绑定了方法,输出"center1"

    //2.走到目标阶段,找到center,有行为,也绑定了事件,输出"目标阶段"

    //3.走到冒泡阶段,又内到外,先找到了center,绑定了事件,输出"center2",
    //然后找到inner,绑定了事件,输出"inner",然后走到outer,在冒泡阶段,没有绑定事件,
    //所以不用管,然后找到body,在冒泡阶段绑定了事件,输出"body",然后找到html,在
    //冒泡阶段没有绑定事件,不用管,最后找到document,没有绑定事件,也不用管

    //所以整个执行输出的结果是:
    //outer
    //center1
    //目标阶段
    //center2
    //inner
    //body
    outer.addEventListener("click", function (e) {
        console.log("outer");
    }, true);
    center.addEventListener("click", function (e) {
        console.log("center1");
    }, true);

    //目标阶段
    center.onclick = function (e) {
        console.log('目标阶段');
    };


    //写false,表示在冒泡阶段执行
    center.addEventListener("click", function (e) {
        console.log("center2");
    }, false);

    //写false,表示在冒泡阶段执行
    inner.addEventListener("click", function (e) {
        console.log("inner");
    }, false);

    //冒泡行为,是浏览器默认有的,只要当前元素被触发,那么就会由内向外传播
    //不管你有没有给它绑定方法
    //所以,不管有没有给center绑定点击事件,冒泡行为依然会执行。

    //注意:不管center有没有绑定事件,只要点击行为触发,就会存在传播。
    //怎么传播,先捕获,再目标,再冒泡,不管点击触发的元素,有没有绑定事件。


</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值