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 则内层触发先于外层



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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • XML转换_xml文件转化为excel格式

    XML转换_xml文件转化为excel格式xml文件<?xmlversion=”1.0″encoding=”utf-8″?><ModelMetadataversion=”1″><!–SpatialReferenceSystem–><SRS>EPSG:4326</SRS><!–OrigininSpatialReferenceSystem–><SRSOrigin>1222.02055172,31.

  • C语言的整型溢出问题 int、long、long long取值范围 最大最小值「建议收藏」

    C语言的整型溢出问题 int、long、long long取值范围 最大最小值「建议收藏」溢出和取值范围C语言的整型溢出问题整数溢出int、longint、longlongint占用字节疑问《C和指针》中写过:long与int:标准只规定long不小于int的长度,int不小于short的长度。double与int类型的存储机制不同,longint的8个字节全部都是数据位,而double是以尾数,底数,指数的形式表示的,类似科学计数法,因此double比

  • win10笔记本电脑双系统 安装黑苹果系统macOS 小白黑苹果乐园下载资源简便安装黑苹果方式,非常详细,还有资源![通俗易懂]

    win10笔记本电脑双系统 安装黑苹果系统macOS 小白黑苹果乐园下载资源简便安装黑苹果方式,非常详细,还有资源![通俗易懂]马上就要考研咯,今天还是作死研究安装了下黑苹果,罪恶感啊言归正传,接下来将献上我的黑苹果教程首先呢第一步下载你所需要的macOS系统,地址如下https://imac.hk/category/macos/这里也有我的几个保存在百度网盘里的黑苹果乐园的系统(1)macOSHighSierra10.13.6(17G65)Clover2.4kr4596黑苹果原…

  • pychan激活码【在线注册码/序列号/破解码】

    pychan激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • mybatis返回对象_存储过程不能返回结果

    mybatis返回对象_存储过程不能返回结果论MyBatis返回结果集_返回实体类还是Map在更多的了解mybatis后发现不单单通过实体类可以直接返回数据,还可以直接返回一个Map结果集(resultType="java.util.Map"),如果是多条数据则返回一个List&lt;Map&lt;String,Object&gt;&gt;结果集。很多人会觉得发现,直接返回一个Map的话太方便了,什么映射什么的全都不用管,只用在sql书…

  • 浅谈JPA优缺点_sql优点

    浅谈JPA优缺点_sql优点一.JPA的理解JPA的总体思想和现有hibernate、TopLink,JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:ORM映射元数据,JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;JPA的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和…

    2022年10月20日

发表回复

您的电子邮箱地址不会被公开。

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