• javascript中的cancelBubble和stopPropagation()


    都是用来阻止事件冒泡
    cancelBubble可以阻止IE和火狐,比较通用

    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"> ,而不是其他后代元素。现在,单击按钮不会

    再折叠样式转换器,而单击边框则会触发折叠操作。但是,单击标签同样什么也不会发生,因为它也是

    一个后代元素。实际上,我们可以不把检查代码放在这里,而是通过修改按钮的行为来达到目标 。

    2. 停止事件传播

    事件对象还提供了一个.stopPropagation()方法,该方法可以完全阻止事件冒泡。与.target类似,这个

    方法也是一种纯JavaScript特性,但在跨浏览器的环境中则无法安全地使用 。不过,只要我们通过

    jQuery来注册所有的事件处理程序,就可以放心地使用这个方法。

    下面,我们会删除刚才添加的检查语句event.target == this,并在按钮的单击处理程序中添加一些代

    码:


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

      同以前一样,需要为用作单击处理程序的函数添加一个参数,以便访问事件对象。然后,通过简单地

    调用event.stopPropagation()就可以避免其他所有DOM元素响应这个事件。这样一来,单击按钮的事件

    会被按钮处理,而且只会被按钮处理。单击样式转换器的其他地方则可以折叠和扩展整个区域。

    3. 默认操作

    如果我们把单击事件处理程序注册到一个锚元素,而不是一个外层的<div>上,那么就要面对另外一个问

    题:当用户单击链接时,浏览器会加载一个新页面。这种行为与我们讨论的事件处理程序不是同一个概

    念,它是单击锚元素的默认操作。类似地,当用户在编辑完表单后按下回车键时,会触发表单的submit

    事件,在此事件发生后,表单提交才会真正发生。

    如果我们不希望执行这种默认操作,那么在事件对象上调用.stopPropagation()方法也无济于事,因为

    默认操作不是在正常的事件传播流中发生的。在这种情况下,.preventDefault()方法则可以在触发默认

    操作之前终止事件 。

    提示 当在事件的环境中完成了某些验证之后,通常会用到.preventDefault()。例如,在表单提交期间

    ,我们会对用户是否填写了必填字段进行检查,如果用户没有填写相应字段,那么就需要阻止默认操作

    。我们将在第8章详细讨论表单验证。

    事件传播和默认操作是相互独立的两套机制,在二者任何一方发生时,都可以终止另一方。如果想要同

    时停止事件传播和默认操作,可以在事件处理程序中返回false,这是对在事件对象上同时调

    用.stopPropagation()和.preventDefault()的一种简写方式。

  • 相关阅读:
    fis3解决web网站缓存问题
    C# 计算每周和每月固定日期
    移动端web页面上滑加载更多功能
    常见三种字符编码的区别:ASCII、Unicode、UTF-8
    ef AddDays报错
    .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
    ajax 传递数组类型参数后台接收不到的问题
    sql server 作业没跑、开启sql 代理服务、新建作业
    在javascript中NodeList和Array的区别及转换方法
    我经历的几种开发模式和心理
  • 原文地址:https://www.cnblogs.com/chenjianhong/p/4145043.html
Copyright © 2020-2023  润新知