onclick()这种写法是DOM0级规范的写法,是所有的浏览器支持的,但是这种写法有不能同时绑定多个事件、使代码耦合在了一起的弊端。但是addEventListener() 是DOM2标准中定义的方法,它可以控制是在事件捕获阶段或者是在冒泡阶段调用事件处理程序。既然这个是DOM2标准中定义的,那么只有支持DOM2级事件处理程序的浏览器才支持这个方法(IE9,Firefox,Safari,Chrome和Opera支持)。

一、onclick()方式

window.onload = function() {
                var container = document.querySelector("#container");
                container.onclick = function() {
                    console.log("第一次onclick事件");
                }
                container.onclick = function() {
                    console.log("第二次onclick事件");
                }
            }     
            //运行结果:“第二次onclick事件”

运行结果是第二个onclick把第一个onclick给覆盖了,虽然大部分情况用on就可以完成想要的结果,但是有时又需要执行多个相同的事件,很明显如果用on不能完成

二、addEventListener()方法

window.onload = function() {
                var container = document.querySelector("#container");
                container.addEventListener("click", function() {
                    console.log("第一个addEventListener事件");
                })
                container.addEventListener("click", function() {
                    console.log("第二个addEventListener事件");
                })
            }
            //运行结果:
            //"第一个addEventListener事件"
            //"第二个addEventListener事件"

addEventListenert方法第一个参数填写事件名,第二个参数是一个函数,第三个参数是指在冒泡阶段还是捕获阶段处理事件处理程序。true代表捕获阶段处理, false代表冒泡阶段处理。第三个参数可以省略,大多数情况也不需要用到第三个参数,不写第三个参数默认false

附:addEventListenert第三个参数的使用

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <style>
        #parent {
            width: 140px;
            height: 70px;
            border: 1px solid #c3c3c3;
            display: -webkit-flex;
            display: flex;
            -webkit-flex-wrap: wrap;
            flex-wrap: wrap;
            -webkit-align-content: center;
            align-content: center;
        }

        #child {
            width: 70px;
            height: 70px;
            margin: 0 auto;
            background-color: coral;
        }
    </style>
    </head>

    <body>

        <div id="parent">
            <div id="child"></div>
        </div>
        <script>
            /*parent.addEventListener("click", function() {
                            console.log("parent");
                        })

                        child.addEventListener("click", function() {
                            console.log("child");
                        })
                        //执行的结果:
                        //child
                        //parent*/

            parent.addEventListener("click", function() {
                console.log("parent");
            }, true)

            child.addEventListener("click", function() {
                console.log("child");
            })
            //执行的结果:
            //parent
            //child
        </script>
    </body>

</html>

点击child元素,执行的顺序:child->parent。addEventListener的第三个参数写的是true,则按照事件捕获的执行顺序进行的,执行的顺序:parent->child。

三、总结

1.于是得出结果,onclick只出现一次,但是addEventListener却可以先后运行不会被覆盖,addEventListener允许给一个事件注册多个监听器。在使用DHTML库或者 Mozilla extensions 这样需要保证能够和其他的库或者差距并存的时候非常有用。

2.事件冒泡执行过程:从最具体的的元素开始向上开始冒泡

3.事件捕获执行过程:从最不具体的元素(最外面的那个盒子)开始向里面冒泡

参考资料:
MDN Web 文档
MDN Web 中文文档