JavaScript中事件的监听

本文深入解析事件监听的概念,探讨如何在不同元素上绑定多个事件处理函数,避免覆盖问题。通过实例说明事件冒泡与捕获机制,以及在现代浏览器与低版本IE间的兼容处理方法。

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

事件的监听
作用:
如果是普通的事件绑定相同事件类型,只能绑定一个事件处理函数
如果同一个类型绑定多个事件处理函数,后绑定的事件会覆盖之前绑定的事件

语法:
标签对象.addEventListener(事件类型 , 事件处理函数)
第三个参数: true / false(默认值)

事件的获取方式
冒泡 : 从子级开始,向父级执行
捕获 : 从父级开始,向子级执行

浏览器默认都是冒泡的执行方式
可以通过 addEventListener 第三个参数来设定获取方式
默认值 false 是 冒泡方式 true是捕获方式
一般实际项目中不定义第三个参数,就使用默认方式
低版本IE只支持冒泡,不支持捕获。不会报错,只会按照冒泡的顺序执行
今后给标签绑定事件,推荐都使用事件监听方式

 <div class="div1">
        <div class="div2">
            <div class="div3"></div>
        </div>
</div>
 var oDiv1 = document.querySelectorAll('div')[0];
 var oDiv2 = document.querySelectorAll('div')[1];
 var oDiv3 = document.querySelectorAll('div')[2];
//普通事件绑定方式,只会执行最后一个绑定的事件处理函数
oDiv1.onclick = function(){
console.log(123)
}

oDiv1.onclick = function(){
console.log(456)
}

oDiv1.onclick = function(){
console.log(789)
}
//点击div只会输出789
 // 事件监听方式
oDiv1.addEventListener('click' , function(){
console.log(123);
})

oDiv1.addEventListener('click' , function(){
console.log(456);
})

oDiv1.addEventListener('click' , function(){
console.log(789);
})
//123、456、789都会执行输出
// 使用事件监听的方式给父子级关系的标签绑定事件
        oDiv1.addEventListener('click' , function(){
            console.log(1111)
        } , true) //点击输出1111

        oDiv2.addEventListener('click' , function(){
            console.log(2222)
        } , true) //点击输出1111和2222

        oDiv3.addEventListener('click' , function(){
            console.log(3333)
        } , true) //点击输出1111和2222和3333

兼容方式:
▲普通浏览器
标签对象.addEventListener(‘事件类型’ , 事件处理函数)
事件类型必须是字符串形式,直接写事件类型名称,不能有on
▲低版本IE浏览器
标签对象.attachEvent(‘on事件类型’ , 事件处理函数)

var oDiv = document.getElementById('div');

        // 一般的监听方式
oDiv.addEventListener('click' , function(){
console.log(123);
})

        // 低版本IE浏览器
oDiv.attachEvent('onclick' , function(){
console.log(456);
})   

使用函数的方式来做兼容处理
参数1要绑定的事件对象
参数2要绑定的事件类型
参数3要绑定的事件处理函数
如果是特殊的事件类型需要绑定,可以再单独写判断

var oDiv = document.getElementById('div');
myAddEvent(oDiv , 'click' , function(){console.log(123) } );

function myAddEvent(ele,type,fun){
            if(ele.addEventListener){
                ele.addEventListener(type,fun)
            }else{
                ele.attachEvent( 'on'+type , fun)
            }
        }

事件监听的删除:

 var oDiv = document.querySelector('div');
        var fun4 = function(){
            console.log('abc');
        }

        oDiv.addEventListener('click' , fun1);
        oDiv.addEventListener('click' , fun2);
        oDiv.addEventListener('click' , fun3);
        oDiv.addEventListener('click' , fun4);
        oDiv.addEventListener('click' , function(){console.log('别想删我')});

        // 可以删除
        oDiv.removeEventListener('click' , fun1);
        oDiv.removeEventListener('click' , fun2);
        oDiv.removeEventListener('click' , fun3);
        oDiv.removeEventListener('click' , fun4);
        // 不能删除
        oDiv.removeEventListener('click' , function(){console.log('别想删我')});

        // 绑定时必须是函数名称,或者存储函数的变量名称,才能删除
        // 绑定时,如果直接定义函数,是不能删除的
        // 原因: 两个函数程序相同,但是地址不同

        function fun1(){
            console.log(123);
        }

        function fun2(){
            console.log(456);
        }

        function fun3(){
            console.log(789);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值