day-14.4 监听事件
监听事件:
当有一个元素已经有一个事件的前提下,要再添加一个同样的事件的时候,
可以用监听事件,也就是说监听事件的意思就是:监听一个事件执行,执行的时候做相应的动作;这里的监听并不仅限于添加了事件函数的元素对象,就算没有添加事件函数的元素对象,触发事件时还是会被监听到;
比如:
1 <body> 2 <div id="wrap"></div> 3 4 <script> 5 var oWrap = document.getElementById("wrap"); //并没有对oWrap对象设定事件函数,但是当点击事件发生时,监听事件还是会触发,并输出1,2,由此可以看出,点击事件的触发机制是DOM内核实现的,跟是否设定点击的事件函数没有关系; 6 oWrap.addEventListener( "mouseup", function (){ 7 console.log(1); 8 }); 9 oWrap.addEventListener ("click",function () { 10 console.log(2); 11 }); 12 </script> 13 </body>
DOM 0级事件:
最原始的事件,类似于onclick,onmuseup 等,这类事件时DOM最早期的,最原始的元素事件,
这类事件的优点:兼容所有浏览器,缺点:一个对象只能绑定一个同一类型的原始事件。比如一个元素对象如果绑定了onclick了,就不能再绑定一个onclick,因为这类事件的函数类似于变量赋值;
比如:
1 oWrap.onclick = function (){ 2 console.log(1); 3 }; 4 oWrap.onclick = function (){ //定义的过程,第二次定义赋值覆盖了顶一次,所以当事件触发执行函数时,只会执行第二个; 5 console.log(2); 6 };
DOM 2级事件(没有1级);
基于函数执行变大形式的监听事件,比如addEventListener(),他其实是DOM已经写好了的函数了,你调用执行就可以了,他监听的是元素的事件是否触发,跟是否绑定事件函数没有关系;
优点:他可以对一个元素对象同时实行多个监听;
缺点:IE8及以下不支持;
1 oWrap.addEventListener ("mouseup",function () { //第一个参数为事件名,跟原始事件的事件名一致,但是不带on,第二个参数为触发的函数; 2 console.log(2); 3 });
移除事件监听:removeEventListener("事件名",“函数名”);
移除事件监听函数里的函数名可以不写,这样就会移除这个对象的所有该事件的监听,但是当你如果只想移除某一个监听时,就必须要写,这就要求我们在设定事件监听的时候,函数尽量别使用匿名函数,这样方便后续针对性的监听移除;
1 oWrap.addEventListener("click",fn); 2 function fn() { 3 console.log(3); 4 } 5 oWrap.removeEventListener("click",fn); //移除fn
IE浏览器8及以下兼容写法;
1 oWrap.attachEvent("onclick",function () {
2 console.log(1);
3 })
4 oWrap.attachEvent("onclick",function () { //会输出2,1,先绑定的后执行,事件需要带on
5 console.log(2);
6 })
IE浏览器8及以下移除的兼容写法;
1 oWrap.attachEvent("onclick",fn); 2 function fn () { 3 console.log(1); 4 } 5 oWrap.detachEvent("onclick","fn");//跟removeListener一样,不要写匿名函数;
事件捕获,
跟冒泡类似,捕获是由子元素到父元素,由父元素捕获了再提交显示;冒泡是父元素的事件冒上来,由子元素接收了再提交显示;
1 <script> 2 var oBox = document.getElementById("box"); 3 /* 4 addEventListener的boolean值: 5 false 冒泡 6 true 捕获 7 事件捕获:从父级到子级往下捕获的事件叫捕获事件 8 ie不支持事件捕获 9 */ 10 oBox.addEventListener("click",fn,true); 11 document.addEventListener("click",fn,true); 12 13 function fn() { 14 console.log(this); 15 } 16 </script>
重复绑定
1 var aDiv = document.getElementsByTagName("div"), 2 value = 0; 3 aDiv[0].addEventListener("click",function () { 4 value += 4; 5 aDiv[1].addEventListener("click",function () { 6 value += 3; 7 8 aDiv[2].addEventListener("click",function () { 9 value += 2; 10 console.log(value); 11 }); 12 console.log(value); 13 }); 14 console.log(value); 15 });
浙公网安备 33010602011771号