原生js--事件绑定、事件监听器及事件解绑

一、事件绑定

事件绑定方式有三种

 1、内联模式

  这种方式是最简单直接的事件处理方式,在内联模型中事件处理函数是HTML标签的属性,用于处理指定事件,但不符合结构、样式、行为相分离的原则。

1 //以onclick为例
2 <button onclick="clickMe()">点我</button>
3 <script>
4   function clickMe(){
5     alert("你点我了!!")
6   }
7 </script>

2、外联模式

  由于内联模式违反了代码层次分离原则,为了让代码看起来更简洁直观,我们可以直接在js代码中处理事件

1 <button id="btn">点我</button>
2 <script>
3     btn.onclick = function(){
4         alert("你还点我!!");
5   }
6 </script>

  这两种方式都使用的是“on+事件类型”绑定事件的方法,而使用这种方法绑定有弊端:同一事件只能给同一元素绑定一次

  也就是说,在内联模式中,一个元素绑定多个事件时,只会执行第一个事件,而在外联模式中,一个元素绑定多个事件时,后面的事件会覆盖前面的事件

如下代码(外联模式):

1 <button id="btn">点我</button>
2 <script>
3   btn.onclick=function(){
4       alert("第一次点我!");
5   }
6   btn.onclick=function(){
7       alert("第二次点我!");  //两个相同的点击事件
8   }
9 </script>

3、事件监听器

为了解决前面两种方式所带来的问题,我们就有了第三种绑定事件的方式,也就是事件监听器

二、事件监听器

addEventListener()语法:
1 obj.addEventListener(type,handle,false);
2 // 参数1:给元素绑定的事件类型,如:click,mouseover。。。
3 // 参数2:处理事件的函数
4 // 参数3:是否在冒泡阶段执行,true在捕获阶段执行,false在冒泡阶段执行,可选项
注意点:1、这一绑定方式可以给同一元素绑定多个事件,不会发生覆盖的情况。如果给同一个元素绑定多个事件,那么采用先绑定先执行的规则 顺序执行
    2、在绑定事件的时候,事件类型前不需带 on 
    3、第三个参数表示是否在捕获阶段执行

    4、可以使用 removeEventListener() 来移除之前绑定过的事件
例:
 1 <button id="btn">点我</button>
 2 <script>
 3 btn.addEventListener("click",handle,false);        //第一次绑定
 4 function handle(){
 5     alert("第一次点击");
 6 }
 7 btn.addEventListener("click",handle1,false);        //第二次绑定
 8 function handle1(){
 9     alert("第二次点击");
10 }
11 </script>

可以看到,使用事件监听器的方式对同一元素多次绑定的事件都可以执行!

当然啦,这么好用的东西怎么可能没有兼容问题呢,低版本IE中没有事件监听,那么针对于IE低版本浏览器的事件监听器绑定方式也是有的:



attachEvent()语法:
1 obj.attachEvent('on' + type,handle);
2 // type表示事件类型
3 // handle表示处理事件的函数

 注意点:1、与addEventListener()不同的是,在绑定事件时事件类型前一定要加 on 

     2、而与addEventListener()第二个不同点在于,如果给同一元素绑定多个事件时,采用先绑定后执行的规则  倒序执行

     3、attachEvent()是针对低版本IE的写法,低版本IE中不存在捕获阶段,所以没有第三个参数

     4、使用detachEvent()移除绑定过的事件

 既然针对于不同浏览器的事件监听器都有了,我们就可以有兼容写法了

 看好了,要出大招了!!

事件监听器绑定兼容写法

1 function bind(ele,type,handle){  // 要绑定的事件对象 ,事件类型 , 事件处理函数
2     if(ele.addEventListener){
3         ele.addEventListener(type,handle,false);
4     }else if(ele.detachEvent){
5         ele.attachEvent("on"+type,handle);
6     }else{
7         ele["on" + type] = callback;
8     }
9 }    

三、事件解绑

 一般情况下,执行过的代码内存会自动回收,但是事件在执行完后,内存没有自动回收,这样会导致内存一直占用,代码执行效率降低,所以我们就要手动回收这个事件 -- 事件解绑

 1、使用“on+事件类型”方式绑定的事件,只要给他赋值为 null ,就能解绑

1 un.onclick=function(){
2     btn.onclick=null; // 给事件赋值一个空,就解绑了
3 }

 2、使用事件监听器的方式绑定的事件解绑方式

  针对于addEventListener()的解绑方式

removeEventListener(ele,type, handle)
// 第一个参数:要解绑的事件对象
// 第二个参数:事件类型
// 第三个参数:事件处理函数

  

 针对于attachEvent()的解绑方式

detachEvent(ele,type, handle)
// 第一个参数:要解绑的事件对象
// 第二个参数:事件类型
// 第三个参数:事件处理函数

 事件绑定有兼容写法,事件解绑同样有兼容写法

1 function unbind(ele,type,handle){
2   if(ele.addEventListener){
3     ele.removeEventListener(type,handle,false);
4   }else if(ele.detachEvent){
5     ele.detachEvent("on"+type,handle);
6   }else{
7     ele["on" + type] = null;
8   }
9 }    

事件解绑通常适用于在事件执行一次后,就不再执行了,就可以在下一次动作中进行解绑

事件解绑有利于性能优化

原文地址:https://www.cnblogs.com/lqi57/p/12499811.html