JS添加事件和移除事件:addEventListener()与removeEventListener()

另有js事件详解  点击打开链接

一.addEventListener()和removeEventListener()讲解

     addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。

     它们都接受3个参数:如     addEventListener("事件名" , "事件处理函数" , "布尔值");        (注:事件名不含"on",如“click”)

     现在的版本可以省略第三个参数,默认值为false

 

示例:

要在body上添加事件处理程序,可以使用下列代码:

扫描二维码关注公众号,回复: 2872449 查看本文章
 
  1. document.body.addEventListener('touchmove', function (event) {

  2. event.preventDefault();

  3. },false);

    通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;移除时传入的参数与添加处理程序时使用的参数相同。这也意味着通过addEventListener()添加的匿名函数无法移除

 

错误用法示例:

 
  1. document.body.addEventListener('touchmove', function (event) {

  2. event.preventDefault();

  3. },false);

  4. document.body.removeEventListener('touchmove', function (event) {

  5. event.preventDefault();

  6. },false);

      这个例子中,使用addEventListener()添加一个事件处理程序。虽然调用removeEventListener(0是看似使用了相同的参数,但实际上,第二个参数与传入addEventListener()中的那一个完全不同的函数。而传入removeEventListener()中的事件处理程序函数必须与传addEventListener()中的相同

正确用法示例:

 
  1. function bodyScroll(event){

  2. event.preventDefault();

  3. }

  4. document.body.addEventListener('touchmove',bodyScroll,false);

  5. document.body.removeEventListener('touchmove',bodyScroll,false);

重写后的这个例子在addEventListener()和removeEventListener()中用的是相同的函数。

共用函数不能带参数,错误用法示例:

 
 
  1. function bodyScroll(event){

  2. event.preventDefault();

  3. }

  4. document.body.addEventListener('touchmove',bodyScroll(),false);

  5. document.body.removeEventListener('touchmove',bodyScroll(),false);

总结:

1:相同事件绑定和解除,需要使用共用函数;绑定和解除事件时 事件没有"on" 即onclick写成click

2:共用函数不能带参数;

二.addEventListener()与removeEventListener()的第三个参数详解

     布尔值参数是true,表示在捕获阶段调用事件处理程序;就是最不具体的节点先接收事件,最具体的节点最后接收事件

    如果是false,在冒泡阶段调用事件处理程序;则是先寻找指定的位置,由最具体的元素接收,然后逐级向上传播至最不具体的元素的节点(文档)

 

DOM事件流如图(剪自javascript高级程序设计):

由图可知捕获过程要先于冒泡过程       即 true的触发顺序在false前面

实例测试


HTML内容:

 
 
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <title>添加事件&&解绑事件</title>

  6. </head>

  7. <body>

  8. <div id="out">

  9. <p>最外面</p>

  10. <div id="middle">

  11. <div id="inner">最里面</div>

  12. </div>

  13. </div>

  14. </body>

  15. </html>

 
 
 

js内容:(第1种情况)

 
 
  1. <script>

  2. var out = document.getElementById('out');

  3. var middle = document.getElementById('middle');

  4. var inner = document.getElementById('inner');

  5. //点击inner时,触发顺序为:inner-------middle------out

  6. out.addEventListener('click',function(){alert("我是最外面的");},false);

  7. middle.addEventListener('click',function(){alert("我是中间的");},false);

  8. inner.addEventListener('click',function(){alert("我是最里面的");},false);

  9. </script>

js内容:(第2种情况)
 
 
  1. <script>

  2. var out = document.getElementById('out');

  3. var middle = document.getElementById('middle');

  4. var inner = document.getElementById('inner');

  5. //点击inner时,触发顺序为:out------middle-------inner

  6. out.addEventListener('click',function(){alert("我是最外面的");},true);

  7. middle.addEventListener('click',function(){alert("我是中间的");},true);

  8. inner.addEventListener('click',function(){alert("我是最里面的");},true);

  9. </script>

js内容:(第3种情况)
 
 
  1. <script>

  2. var out = document.getElementById('out');

  3. var middle = document.getElementById('middle');

  4. var inner = document.getElementById('inner');

  5. //点击inner时,触发顺序为:out------inner-------middle

  6. out.addEventListener('click',function(){alert("我是最外面的");},true);

  7. middle.addEventListener('click',function(){alert("我是中间的");},false);

  8. inner.addEventListener('click',function(){alert("我是最里面的");},false);

  9. </script>

js内容:(第4种情况)
 
 
  1. <script>

  2. var out = document.getElementById('out');

  3. var middle = document.getElementById('middle');

  4. var inner = document.getElementById('inner');

  5. //点击inner时,触发顺序为:out-------middle------inner

  6. out.addEventListener('click',function(){alert("我是最外面的");},true);

  7. middle.addEventListener('click',function(){alert("我是中间的");},true);

  8. inner.addEventListener('click',function(){alert("我是最里面的");},false);

  9. </script>

js内容:(第5种情况)
 
 
  1. <script>

  2. var out = document.getElementById('out');

  3. var middle = document.getElementById('middle');

  4. var inner = document.getElementById('inner');

  5. //点击inner时,触发顺序为:middle-------inner------out

  6. out.addEventListener('click',function(){alert("我是最外面的");},false);

  7. middle.addEventListener('click',function(){alert("我是中间的");},true);

  8. inner.addEventListener('click',function(){alert("我是最里面的");},false);

  9. </script>

 
js内容:(第6种情况)
 
  1. <script>

  2. var out = document.getElementById('out');

  3. var middle = document.getElementById('middle');

  4. var inner = document.getElementById('inner');

  5. //点击inner时,触发顺序为:out-------inner------middle

  6. out.addEventListener('click',function(){alert("我是最外面的");},true);

  7. middle.addEventListener('click',function(){alert("我是中间的");},false);

  8. inner.addEventListener('click',function(){alert("我是最里面的");},true);

  9. </script>

addEventListener的第三个参数有两种情况:ture & false 所以有2*2*2=8种情况

 
 
结论:
1.true的触发顺序总是在false前面
2.如果多个均为true   则外层触发先于内层
 
3.如果多个均为false  则内层触发先于外层

猜你喜欢

转载自blog.csdn.net/gabby____/article/details/81812064