详解onclick和addEventListener的区别

摘要

当我们想要给某个DOM元素绑定事件的时候,最常用的方法是通过on + 事件名字的方式。而在DOM2级事件定义了两个方法,用于处理指定和删除事件处理程序的操作:
addEventListener()和removeEventListener().
并且它们都接受三个参数:要处理的事件名,作为事件处理的一个函数,一个布尔值。

最后的布尔值如果为false,表示在冒泡阶段调用事件处理函数,如果是true,表示在捕获阶段调用事件处理程序。

区别1:同时绑定多个事件

我们来想一个问题,我们使用onclick方法可不可以给一个按钮绑定多个事件呢?
我们来尝试一下:

    <button id="btn">点击</button>
    <script>
        btn.onclick = function(){
      
      
            console.log('第一次点击');
        }
        btn.onclick = function(){
      
      
            console.log('第二次点击');
        }
    </script>

然后我们来看一下结果是否两次都打印出来了:
在这里插入图片描述
可以看到只有第二次生效了,说明通过这种方法第二次绑定事件会将第一次覆盖!

现在我们来用第二种方法:

    <button id="btn">点击</button>
    <script>
        btn.addEventListener('click',()=>{
      
      console.log('第一次点击');},false);
        btn.addEventListener('click',()=>{
      
      console.log('第二次点击'),false});
    </script>

我们来看一下运行结果:
在这里插入图片描述
OK,可以看到通过这种方式我们是可以进行多次绑定事件的。

2.决定事件触发顺序

我们先来看一下代码:

    <div id="div1">
        <button id="btn">点击</button>
    </div>
    <script>
        div1.onclick = function(){
      
      
            console.log('div1的事件');
        }
        btn.onclick = function(){
      
      
            console.log('btn的事件');
        }
    </script>

想一下如果我们点击了按钮,打印的顺序应该是什么样子的呢?
在这里插入图片描述
可以看到是从内而外,是以事件冒泡的方式来执行的。

而如果使用另一种方法:

    <div id="div1">
        <button id="btn">点击</button>
    </div>
    <script>
        btn.onclick = function(){
      
      
            console.log('btn的事件');
        }
        div1.addEventListener('click',()=>{
      
      console.log('div1的事件');},true);
    </script>

我现在把div1的事件通过addEventListener的方式来绑定,并且给第三个参数设置为true。
那么结果就是这样的:
在这里插入图片描述
所以我们通过第二种方法我们可以决定DOM事件的触发是以事件捕获的事件流还是事件冒泡的事件流方式。

3.removeEventListener的使用方法

这个方法就是删除DOM指定的事件,如果我们删除onclick的话,直接将onclick的值设置为null就可以了。
那这个方法如何删除呢?我们来看一下代码:

        div1.addEventListener('click',()=>{
    
    console.log('div1的事件');},true);
        div1.removeEventListener('click',()=>{
    
    console.log('div1的事件');},true);

这样做的话我们是否能将这个事件删除呢?答案是否定的,我们的两个事件处理程序虽然代码是一样的,但是它们确确实实不是一个事件处理程序,如果我们想要删除掉某个事件,我们必须这样做:

        var fn = function(){
    
    
            console.log('div1的事件');
        }
        div1.addEventListener('click',fn,true);
        div1.removeEventListener('click',fn,true);

只有这样才能确定两个方法所用的为一段事件处理程序,也是有效的删除方法。

猜你喜欢

转载自blog.csdn.net/weixin_46726346/article/details/117252776