美文网首页
js事件学习之一事件冒泡机制

js事件学习之一事件冒泡机制

作者: 秋染蒹葭 | 来源:发表于2017-06-14 19:21 被阅读279次

1:事件目标

事件处理程序中的变量event保留着事件对象,event.target属性保存着事件的目标元素。该属性没有被所有浏览器实现 。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');
  }
  })
 })

此时的代码确保了被单击的元素是id="switcher",而不是其他后代元素。

2:事件捕获与事件冒泡

事件冒泡与事件捕获是描述事件触发时序问题的术语,事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。相反的,事件冒泡是自下而上的去触发事件。绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡。Jquery的e.stopPropagation会阻止冒泡。


<ul>
   <li>item1</li>
   <li>item2</li>
   <li>item3</li>
   <li>item4</li>
   <li>item5</li>
   <li>item6</li>
   <
/ul>

//事件绑定代码
//利用事件冒泡实现:

  $("ul").on("click",function(e){
       $(e.target).css("background-color","#ddd").siblings().css("background-color","white");
    })
//也可以给所有事件都绑定上

  $("li").on("click",function(){
       $(this).css("background-color","#ddd").siblings().css("background-color","white");
   })

两种方法看似相似但相差甚远:

  • 前者少了一个遍历所有li节点的操作,所以在性能上肯定是更优的。

  • 如果我们在绑定事件完成后,页面又动态的加载了一些元素
    $("<li>item7</li>").appendTo("ul");
    这时候,第二种方案,由于绑定事件的时候item7还不存在,所以为了效果,我们还要给它再绑定一次事件。而利用冒泡方案由于是给ul绑定的所以不存在问题

3:阻止事件冒泡

事件冒泡就是事件传播,有些时候我们为了获取某个元素的点击事件而不是某个其他的后代元素或者父元素,我们可以采用上述的e.target的方式,我们也可以对按钮的事件进行过滤,即取消事件冒泡。我们使用.stopPropagation(),这个方法也是一种纯JavaScript特性,但在跨浏览器的环境中则无法安全地使用 。不过,只要我们通过jQuery来注册所有的事件处理程序,就可以放心地使用这个方法。在你要处理的事件之前加上e.preventDefault();那么就取消了行为(通俗理解:相当于做了个return操作),不执行之后的语句了。

使用方式如下:


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


同以前一样,需要为用作单击处理程序的函数添加一个参数,以便访问事件对象。然后,通过简单地调用event.stopPropagation()就可以避免其他所有DOM元素响应这个事件。这样一来,单击按钮的事件会被按钮处理,而且只会被按钮处理。

4:默认事件

可能有些人会疑惑.preventDefault()哪去了,这就牵扯到默认操作了。如果我们将单击事件处理程序放在一个锚元素上,而不是的一个正常的div等元素,就会有个问题:用户单击连接时,浏览器就会加载一个新的页面。但是这种行为与我们讨论的事件处理程序不是同一个概念,这个单击锚元素的默认操作。同理,用户编辑完表格的回车键的点击触发的submit事件,也是一个默认操作。

我们想取消这种默认操作采用的方式是.preventDefault()而不是.stopPropagetion()。我们对表单的提交信息检查不通过时可以通过此方法进行阻止默认操作。

事件传播和默认操作是相互独立的两套机制,在二者任何一方发生时,都可以终止另一方。如果想要同时停止事件传播和默认操作,可以在事件处理程序中返回false,这是对在事件对象上同时调用.stopPropagation()和.preventDefault()的一种简写方式。

点击查看参考内容

f14

相关文章

  • js事件学习之一事件冒泡机制

    1:事件目标 事件处理程序中的变量event保留着事件对象,event.target属性保存着事件的目标元素。该属...

  • js事件深入学习

    JavaScript的事件机制包含,事件绑定、事件监听、事件委托(事件代理)等 js中的事件流 ① .冒泡:当下级...

  • 图解事件委托

    事件捕获和事件冒泡 说到事件委托我们就不得不提JS中事件的整个历程中的两个机制:事件捕获和事件冒泡。 然而要说这事...

  • js事件机制

    一、js事件机制三个阶段:事件捕获、事件目标处理函数、事件冒泡 js中事件执行的整个过程称之为事件流,分为三个阶段...

  • 事件委托

    事件委托 事件委托其实就是利用JS事件冒泡机制把原本需要绑定在子元素的响应事件(click、keydown……)委...

  • 性能优化——事件代理

    了解过JS的事件机制应该知道JS的事件触发后会有一个冒泡阶段。事件代理就是利用了这个机制。 我们考虑这样一个情况 ...

  • JavaScript中的冒泡事件

    事件冒泡机制 事件冒泡发生的条件:当为多个嵌套的元素设置了相同的事件处理程序,它们将触发事件冒泡机制。在事件冒泡中...

  • 什么是事件代理和事件委托

    昨天讲过了事件冒泡,其实事件代理和事件委托就是来源于事件冒泡机制。经常写js的人应该都知道这个方法。一个交互丰富的...

  • JS事件相关基础

    js事件: 键盘事件: JS中的事件冒泡和事件捕获: 1、事件冒泡。如下代码: 点击button事件,连同父元素绑...

  • Node.js 的 events 模块

    Node.js 没有浏览器的事件冒泡、事件捕获机制。 events 模块是 Node.js 基础及重要的模块, 只...

网友评论

      本文标题:js事件学习之一事件冒泡机制

      本文链接:https://www.haomeiwen.com/subject/bijeqxtx.html