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

js添加事件和移除事件:addEventListener()与removeEventListener()作用:   addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。   它们都接受3个参数:事件名、事件处理的函数和布尔值。   布尔值参数是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。示例:环境:移动端,界面禁止触摸事件要在bo

大家好,又见面了,我是你们的朋友全栈君。

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


一.addEventListener()和removeEventListener()讲解

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

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

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


示例:

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

document.body.addEventListener('touchmove', function (event) {    event.preventDefault();},false);

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


错误用法示例:

document.body.addEventListener('touchmove', function (event) {
    event.preventDefault();
},false);
document.body.removeEventListener('touchmove', function (event) {
    event.preventDefault();
},false);

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


正确用法示例:

function bodyScroll(event){
    event.preventDefault();
}
document.body.addEventListener('touchmove',bodyScroll,false);
document.body.removeEventListener('touchmove',bodyScroll,false);

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


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

function bodyScroll(event){ event.preventDefault(); } document.body.addEventListener('touchmove',bodyScroll(),false); document.body.removeEventListener('touchmove',bodyScroll(),false);


总结:

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

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

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

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

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

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

js添加事件和移除事件:addEventListener()与removeEventListener()由图可知捕获过程要先于冒泡过程       即 true的触发顺序在false前面

实例测试


HTML内容:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加事件&&解绑事件</title>
</head>
<body>
    <div id="out">
        <p>最外面</p>
        <div id="middle">
            <div id="inner">最里面</div>
        </div>
    </div>
</body>
</html>



js内容:(第1种情况)

<script>
  var out = document.getElementById('out'); 
  var middle = document.getElementById('middle'); 
  var inner = document.getElementById('inner'); 
  //点击inner时,触发顺序为:inner-------middle------out
  out.addEventListener('click',function(){alert("我是最外面的");},false);   
  middle.addEventListener('click',function(){alert("我是中间的");},false);    
  inner.addEventListener('click',function(){alert("我是最里面的");},false); 
</script>

js内容:(第2种情况)
<script>
  var out = document.getElementById('out'); 
  var middle = document.getElementById('middle'); 
  var inner = document.getElementById('inner'); 
  //点击inner时,触发顺序为:out------middle-------inner
  out.addEventListener('click',function(){alert("我是最外面的");},true);   
  middle.addEventListener('click',function(){alert("我是中间的");},true);  
  inner.addEventListener('click',function(){alert("我是最里面的");},true); 
</script>

js内容:(第3种情况)
<script>
  var out = document.getElementById('out'); 
  var middle = document.getElementById('middle'); 
  var inner = document.getElementById('inner'); 
  //点击inner时,触发顺序为:out------inner-------middle
  out.addEventListener('click',function(){alert("我是最外面的");},true);   
  middle.addEventListener('click',function(){alert("我是中间的");},false);    
  inner.addEventListener('click',function(){alert("我是最里面的");},false);
</script>

js内容:(第4种情况)
<script>
  var out = document.getElementById('out'); 
  var middle = document.getElementById('middle'); 
  var inner = document.getElementById('inner'); 
  //点击inner时,触发顺序为:out-------middle------inner
  out.addEventListener('click',function(){alert("我是最外面的");},true);   
  middle.addEventListener('click',function(){alert("我是中间的");},true);  
  inner.addEventListener('click',function(){alert("我是最里面的");},false);
</script>

js内容:(第5种情况)
<script>
  var out = document.getElementById('out'); 
  var middle = document.getElementById('middle'); 
  var inner = document.getElementById('inner'); 
  //点击inner时,触发顺序为:middle-------inner------out
  out.addEventListener('click',function(){alert("我是最外面的");},false);   
  middle.addEventListener('click',function(){alert("我是中间的");},true);  
  inner.addEventListener('click',function(){alert("我是最里面的");},false);
</script>

js内容:(第6种情况)
<script>
  var out = document.getElementById('out'); 
  var middle = document.getElementById('middle'); 
  var inner = document.getElementById('inner'); 
  //点击inner时,触发顺序为:out-------inner------middle
  out.addEventListener('click',function(){alert("我是最外面的");},true);   
  middle.addEventListener('click',function(){alert("我是中间的");},false);    
  inner.addEventListener('click',function(){alert("我是最里面的");},true);
</script>

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



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



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158174.html原文链接:https://javaforall.net

(1)
上一篇 2022年7月12日 上午7:36
下一篇 2022年7月12日 上午7:36


相关推荐

  • 网络安全:小心MSHTA漏洞为黑客开启远程控制之门

    网络安全:小心MSHTA漏洞为黑客开启远程控制之门这是一个可以让黑客欣喜若狂的新漏洞,一旦该漏洞被激活,就会有大量计算机成为黑客手中的肉鸡,被人远程控制不可避免……  微软的Windows操作系统在进行了短暂的“喘息”后,近日又在攻击爱好者不懈努力下,被成功找出几个高危的系统安全漏洞,而MicrosoftWindowsMSHTA脚本执行漏洞就是其中的重要一员。  安全公告牌  MSHTA即HTA,此处的MS主要用于强调这是微软的

    2022年7月15日
    18
  • Py之seaborn:seaborn库的简介、安装、使用方法之详细攻略

    Py之seaborn:seaborn库的简介、安装、使用方法之详细攻略Py 之 seaborn seaborn 库的简介 安装 使用方法之详细攻略目录 seaborn 库的简介 seaborn 库的安装 seaborn 库的使用方法 0 相关文章 1 案例应用 seaborn 库的简介 Seabn 是一个在 Python 中制作有吸引力和丰富信息的统计图形的库 它构建在 MatPultLB 的顶部 与 PyDATA 栈紧密集成 包括

    2026年3月18日
    2
  • Pycharm如何自动换行

    Pycharm如何自动换行只对当前文件有效的操作是菜单栏 View ActiveEditor UseSoftWraps 要是想对所有文件都起到效果 就要在 setting 里面进行操作 Perferences Editor General Usesoftwraps

    2026年3月27日
    3
  • require(src)报警告Critical dependency: the request of a dependency is an expression

    require(src)报警告Critical dependency: the request of a dependency is an expressionletsrc assets imgs ziyuan6 png require src require 接收了一个变量 会报上面的警告 接收一个写死的字符串值时则没有警告 下面三种写法没有报警告 require assets imgs ziyuan6 png

    2026年3月18日
    2
  • 移动应用界面设计的尺寸规范「建议收藏」

    移动应用界面设计的尺寸规范「建议收藏」移动应用的界面设计画布尺寸设计多大(特别是Android)、图标和字体大小怎么定、需要设计多套设计稿么、如何切图以配合开发的实现?本篇将结合iOS和android官方的设计规范、搜集的资料以及工作中的摸索,来分享移动应用界面设计中的尺寸规范等问题,希望能给移动端的新手设计师些许指引。若有不当之处,欢迎斧正。一、android篇1、android分辨率屏幕尺寸指实际的物理尺寸,为

    2022年6月21日
    31
  • 6 周的 Claude Code 使用感悟

    6 周的 Claude Code 使用感悟

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号