参考链接:
1、https://baijiahao.baidu.com/s?id=1599714345736557392&wfr=spider&for=pc
2、https://segmentfault.com/a/1190000006667581

1、事件绑定的几种方式

  • 行内绑定
  • 动态绑定
  • 事件监听

行内绑定

即html标签绑定:属性赋值 ,这个在该元素的properties属性中可以查到, 也可以在事件监听中看到
语法:<标签 属性列表 事件=”事件的处理程序” />
如:
缺点:html代码 和js代码严重耦合

<body>
    <button onclick="show()" id="btn1" onclick="print()">html标签绑定</button>
    <button onclick="show();print()" id="btn2">绑定2 </button>
</body>
<script>
    function show(){
        console.log("show");

    }
    function print(){
        var a=document.getElementById("btn2");
        console.log(a.innerHTML);
    }
</script>

点击第一个按钮只会触发show函数,不会触发print函数
点击第二个按钮会触发两个函数

动态绑定:在js代码中绑定

dom对象.事件=事件的处理程序

我们可以在DOM元素上绑定onclick、onmouseover、onmouseout、onmousedown、onmouseup、ondblclick、onkeydown、onkeypress、onkeyup等

 <button id="btn3">wawawa</button>
var btn3=document.getElementById("btn3");
    btn3.onclick=function(){
        console.log("www");
    }

行内绑定和动态绑定的区别

  • this指向不同
    1. 行内绑定时,函数内部的this指向window
    2. 动态绑定时,函数内部的this指向当前正在操作的dom元素
      图片说明

事件监听:只可以在该元素的事件监听中看到

事件监听分别定义了3个事件阶段:捕获阶段,目标阶段,冒泡阶段
addListener有一个最后的可选的参数,指定事件在捕获还是冒泡阶段执行。true为捕获,false为冒泡,默认false

    document.getElementById("btn4").addEventListener("click",show);
    document.getElementById("btn4").addEventListener("click",print);
    document.getElementById("btn4").removeEventListener("click");

但这种方法在ie下是行不通的,ie有自己的事件处理程序方法attachEvent()和detachEvent(),事实上和addEventListener是一样的,但只有两个参数,默认为冒泡形式

/* html */
<button id="btn">ClickMe</button>

/* js */
var oBtn = document.getElementById('btn');
// 事件处理函数
function evtFn(){ 
    console.log(this);
}
// 添加句柄
oBtn.attachEvent('onclick',evtFn);

// 移除句柄
oBtn.detachEvent('onclick',evtFn);