js事件防止冒泡

js事件防止冒泡

大家好,又见面了,我是全栈君。

原文连接:http://www.cnblogs.com/jams742003/archive/2009/08/29/1556187.html

1. 事件目标

如今。事件处理程序中的变量event保存着事件对象。而event.target属性保存着发生事件的目标元素。这个属性是DOM API中规定的,可是没有被全部浏览器实现 

jQuery对这个事件对象进行了必要的扩展,从而在不论什么浏览器中都能够使用这个属性。通过.target,能够确定DOM中首先接收到事件的元素(即实际被单击的元素)。

并且,我们知道this引用的是处理事件的DOM元素,所以能够编写下列代码:
$(document).ready(function(){
 $(‘#switcher’).click(function(event){
  $(‘#switcher .button’).toggleClass(‘hidden’);
  })
 })
  
$(document).ready(function(){
 $(‘#switcher’).click(function(event){
  if(event.target==this){
  $(‘#switcher .button’).toggleClass(‘hidden’);
  }
  })
 })
此时的代码确保了被单击的元素是<div id=”switcher”> ,而不是其它后代元素。如今,单击button不会再折叠样式转换器。而单击边框则会触发折叠操作。可是,单击标签相同什么也不会发生,由于它也是一个后代元素。实际上。我们能够不把检查代码放在这里,而是通过改动button的行为来达到目标 

2. 停止事件传播

事件对象还提供了一个.stopPropagation()方法,该方法能够全然阻止事件冒泡。与.target类似,这种方法也是一种纯JavaScript特性,但在跨浏览器的环境中则无法安全地使用 

只是,仅仅要我们通过jQuery来注冊全部的事件处理程序。就能够放心地使用这种方法。

以下。我们会删除刚才加入的检查语句event.target == this。并在button的单击处理程序中加入一些代码:

$(document).ready(function(){
 $(‘#switcher .button’).click(funtion(event){
  //……
   event.stopPropagation();
  })
 }) 

  同曾经一样,须要为用作单击处理程序的函数加入一个參数。以便訪问事件对象。然后。通过简单地调用event.stopPropagation()就能够避免其它全部DOM元素响应这个事件。这样一来,单击button的事件会被button处理。并且仅仅会被button处理。

单击样式转换器的其它地方则能够折叠和扩展整个区域。

3. 默认操作

假设我们把单击事件处理程序注冊到一个锚元素,而不是一个外层的<div>上,那么就要面对另外一个问题:当用户单击链接时。浏览器会载入一个新页面。这样的行为与我们讨论的事件处理程序不是同一个概念,它是单击锚元素的默认操作。类似地,当用户在编辑完表单后按下回车键时。会触发表单的submit事件,在此事件发生后,表单提交才会真正发生。

假设我们不希望运行这样的默认操作。那么在事件对象上调用.stopPropagation()方法也无济于事,由于默认操作不是在正常的事件传播流中发生的。

在这样的情况下,.preventDefault()方法则能够在触发默认操作之前终止事件 

提示 当在事件的环境中完毕了某些验证之后,一般会用到.preventDefault()。比如。在表单提交期间。我们会对用户是否填写了必填字段进行检查。假设用户没有填写对应字段,那么就须要阻止默认操作。我们将在第8章具体讨论表单验证。

事件传播和默认操作是相互独立的两套机制,在二者不论什么一方发生时,都能够终止还有一方。假设想要同一时候停止事件传播和默认操作,能够在事件处理程序中返回false。这是对在事件对象上同一时候调用.stopPropagation().preventDefault()的一种简写方式。

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

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

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

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

(0)


相关推荐

  • CardView覆盖问题

    CardView覆盖问题最近做项目的时候需要在CardView右上角加上一个删除按钮,但是发现不管怎么嵌套总是被CardView覆盖,查资料后发现需要给浮在上层的View添加elevation属性。原因:因为CardView的使用过程中设置了app:cardElevation=”5dp”的属性,在MD设计中,视图有高度的概念,用Z来表示,Z受到Elevation和Translation两个量控制,因为这个高度的概念…

    2022年10月11日
  • 远程连接工具SecureCRTPortable连接不上linux的解决方法[通俗易懂]

    远程连接工具SecureCRTPortable连接不上linux的解决方法[通俗易懂]今天学习linux用远程工具连接时,连接不上,出现了一个类似函数的东西,运用了排除法,1.先检查了虚拟机服务是否开启2.然后ping网关看能通吗3.然后pingDNS域名,再pingwww.baidu.com都能ping通,百思不得其解然后通过查资料,输入route发现default后面并没有分配默认网关于是输入routeadddefaultgw192.168…

  • Java–反射

    Java–反射反射定义用途(了解)反射基本信息反射相关的类Class类(反射机制的起源)反射的使用反射优点和缺点定义Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。用途(了解)1、在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对

  • MySQL增删改查常用语句命令「建议收藏」

    MySQL增删改查常用语句命令「建议收藏」 2017/11/01 |  未分类 |songjian|  1条评论 |  1818viewsMySQL关系型数据库RDS中的老大哥,增删改查是MySQL入门的基础,数据库吧来说说MySQL数据库增删改查常用语句。增删改查语句增删改查的语句命令为增:insert删:delete改:update查:SELECT或者show库操作创建数据库:createdatabaseshujukuba;…

    2022年10月25日
  • JedisPool踩坑记录

    JedisPool踩坑记录报错信息:Exceptioninthread”main”redis.clients.jedis.exceptions.JedisExhaustedPoolException:Couldnotgetaresourcesincethepoolisexhausted在网上找了很久没有找到,现在看来提示已经讲的很明白了,Jedis池耗尽异常:由于池已耗尽,无法获取资源原因就是最大连接数不够使用,我在类中启动了60个并发线程,然而连接池最大连接数只有50,所以报错。packa

  • 详解MIPI协议

    详解MIPI协议目录前言MIPI简介MIPI联盟的MIPIDSI规范MIPI名词解释MIPIDSI分层结构command和video模式D-PHYLane模组Lane全局架构Lane电压和状态DATALANE操作模式时钟LANE低功耗状态高速数据传输高速CLK传输D-PHY总结DSICSI前言MIPI接口的内部非常复杂,如果不是专门去做MIPI接口,没有必要像研究H264一样往深入的去研究。我们知道MIPI协议连接了camera与soc、LCD和soc,作为此间的开发者,我们只需要关注他怎么使用就可以了知识

发表回复

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

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