前边写过一篇js中的事件处理程序的文章,今天来讲一下如果同一个事件,绑定了多个事件处理程序会怎么样
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button id="btn1" onclick="fn1();">原生js绑定了两个点击事件</button>
<button id="btn2" onclick="fn1();">jQuery绑定了两个点击事件</button>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script type="text/javascript">
var btn1 = document.getElementById("btn1");
function fn1(){
alert("HTML事件处理程序");
}
btn1.onclick = function(){
alert("DOM0级的第一个事件处理程序");
};
btn1.onclick = function(){
alert("DOM0级的第二个事件处理程序");
};
btn1.addEventListener("click",function(){
alert("btn1的第一个DOM2级事件处理程序");
},false);
btn1.addEventListener("click",function(){
alert("btn1的第二个DOM2级事件处理程序");
},false);
$("#btn2").click(function(){
alert("btn2第一个事件处理");
});
$("#btn2").click(function(){
alert("btn2第二个事件处理");
});
$("#btn2").bind("click",function(){
alert("bind绑定的第一个事件处理程序");
});
$("#btn2").bind("click",function(){
alert("bind绑定的第二个事件处理程序");
});
</script>
</body>
</html>
这里,给btn1分别绑定了HTML事件处理程序、两个DOM0级事件处理程序以及两个DOM2级事件处理程序。
btn2使用jQuery中的bind方法和click都是绑定了两个事件处理程序。
最后结果是:
点击btn1,按顺序弹出“DOM0级的第一个事件处理程序”、“btn1的第一个DOM2级事件处理程序”、“btn1的第二个DOM2级事件处理程序”。
点击btn2,按顺序弹出HTML事件处理程序、btn2第一个事件处理、btn2第二个事件处理、bind绑定的第一个事件处理程序、bind绑定的第二个事件处理程序。
然后注释掉DOM0级的两个事件处理程序后,点击btn1后弹出HTML事件处理程序、btn1的第一个DOM2级事件处理程序、btn1的第二个DOM2级事件处理程序。
很神奇啊!
总结一下,就是DOM0级事件处理程序,后边定义的事件处理程序会覆盖掉前边的。而DOM2级和jQuery中没有这种情况。