事件处理模型

本文深入探讨了事件处理模型,包括事件冒泡和事件捕获的概念。事件冒泡是指事件从子元素向父元素传递,而事件捕获则是自window开始向目标元素捕获。DOM事件流分为捕获阶段、目标阶段和冒泡阶段。可以使用event.stopPropagation()阻止事件冒泡(不支持IE9以下),IE则使用event.cancelBubble = true。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.事件处理模型

(1)事件冒泡

  • 结构上嵌套的元素,会存在事件冒泡功能,也就是说,同一事件,子元素会向父元素冒泡
  • 无论哪种绑定方法都存在事件冒泡
    var wrapper = document.getElementsByClassName('wrapper')[0];
    var content = document.getElementsByClassName('content')[0];
    var box = document.getElementsByClassName('box')[0];
    wrapper.addEventListener('click', function(){
        console.log('wrapper');
    },false);
    content.addEventListener('click', function(){
        console.log('content');
    },false);
    box.addEventListener('click', function(){
        console.log('box');
    },false)
点击box时

(2) 事件捕获

  • 结构上存在嵌套的元素,会存在事件捕获,即同一事件,自window捕获至子元素(事件源元素)
  • 触发条件:ele.addEventListener(type, fn, true)
  • 如示例点击box依次输出:window document html body wrapper content box
    window.addEventListener('click', function(){
        console.log('window');
    },true);
    document.addEventListener('click', function(){
        console.log('document');
    },true);
    document.documentElement.addEventListener('click', function(){
        console.log('html');
    },true)
    document.body.addEventListener('click', function(){
        console.log('body');
    },true);

     wrapper.addEventListener('click', function(){
        console.log('wrapper');
    },true);
    content.addEventListener('click', function(){
        console.log('content');
    },true);
    box.addEventListener('click', function(){
        console.log('box');
    },true)

2.dom事件流

(1)dom事件捕获及冒泡的具体流程

  • window => document => html => body ...父元素 目标元素
  • 目标元素 => 父元素  ... => body => html => document => window

(2)dom事件流:捕获过程,目标阶段,冒泡过程,值得注意的是,当目标既绑定捕获事件处理函数,又绑定冒泡时间处理函数,目标阶段时,先绑定谁就先执行谁,如:

    wrapper.addEventListener('click', function(){
        console.log('冒泡-wrapper');
    },false);
    content.addEventListener('click', function(){
        console.log('冒泡-content');
    },false);
    box.addEventListener('click', function(){   //先绑定冒泡
        console.log('冒泡-box');
    },false)
    wrapper.addEventListener('click', function(){
        console.log('捕获-wrapper');
    },true);
    content.addEventListener('click', function(){
        console.log('捕获-content');
    },true);
    box.addEventListener('click', function(){  //再绑定捕获
        console.log('捕获-box');
    },true)

3.取消事件冒泡

(1)W3C标准,event.stopPropagation(); 不支持ie9以下版本

    wrapper.attachEvent("onclick", function(){
        console.log("wrapper")
    })
    content.attachEvent("onclick", function(){
        console.log("content")
    })
    box.attachEvent("onclick", function(){
        var event = window.event;
        event.cancelBubble = true;
        console.log("box")
    })

(2)IE独有,event.cancleBubble = true;

    wrapper.attachEvent("onclick", function(){
        console.log("wrapper")
    })
    content.attachEvent("onclick", function(){
        console.log("content")
    })
    box.attachEvent("onclick", function(){
        var event = window.event;
        event.cancelBubble = true;
        console.log("box")
    })

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值