• [JS]事件捕获和冒泡


    1.在浏览器大战期间对于事件的处理Netscape和Microsoft是不同的实现方式。

    网景采用的是捕获流,微软采用的是冒泡流

    在如下代码中

    <div class="parent">
    <span class="child"></span>
    </div>
    _事件绑定
    如果给div和span都绑定了click事件,用户点击span标签的时候div和span标签上的click事件均会触发的.但是触发的顺序在冒泡流和捕获流中的顺序是不一样的;在冒泡流中span上的事件先行触发,然后才是div上的事件触发,但是在捕获流中的触发顺序是先是div上的事件触发,然后才是span上的事件触发.
    在DOM中是综合和两种触发事件流,
    任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。
    通常程序员可以自行选择采用哪种事件流:
      
    ele.addEventListener('click',doSomething,true);
      参数三:true表示的是捕获;false表示的冒泡
      但是在部分IE浏览器中不支持
    addEventListener(),没法通过第三个参数来设置是冒泡还是捕获,但是在不支持addEventListener()方法的浏览器中默认采用的就是冒泡流,且绑定事件的的方法是ele.attachEvent("onclick", doSomething);
    _事件阻止
    事件的触发过程也是可以阻止的,由于IE和非IE浏览器的事件绑定方法不同那么其阻止事件的方法也会不同的
    • 在DOM中,使用stopPropagation()方法
    • 在IE下设置cancelBubble = true;
    一般为了浏览器的兼容性写法如下
    if(e.stopPropagation){
      e.stopPropagation();
    }else{
      e.cancelBubble=true;
    }
    *在阻止事件事件的时候有两种方法分别是:
    stopPropagation()和stopImmediatePropagation()两个是有却别的
    stopPropagation()方法是作用在后续节点上的,不能阻止当前节点的事件
    stopImmediatePropagation()方法是作用的当前节点的,当然后续节点也是有用的
    如果的$("span.child")上绑定两个点击事件,在$("div.parent")上绑定事件,如果在span的第一个点击事件后放置stopPropagation()方法,当前节点的第二个点击事件还会继续执行的,但是如果是stopImmediatePropagation()方法那么第一个绑定事件执行完后不会调用第二个绑定事件;
    当然不管是绑定的stopPropagation()还是stopImmediatePropagation()后续的div上的事件均不会触发的.
    _事件取消
    取消事件是取消函数执行后的浏览器默认行为,而不是退出函数.如果希望取消事件的同时又想退出函数就需要取消事件的同时return退出函数
    取消事件
      在DOM中:e.preventDefault();
      IE:e.returnValue = false;
    _上述说的IE浏览器指的是IE8及以下版本的浏览器,在高级IE浏览器中开始遵守DOM标准了

    2.事件分为三个阶段:

    依次为 ①捕获阶段,②目标阶段,③冒泡阶段,
    第一阶段:事件从文档根元素开始逐层向下传递,直到找到事件目标,
    第二阶段:找到事件目标并触发相应的事件,
      获取目标:DOM:e.target
           IE8:e.SRCElement

    第三阶段:从目标逐层向上返回到根节点,

    利用事件冒泡优化规则:如果多个同级子元素,都绑定了相同的事件处理函数,就可以仅在父元素上绑定一次即可,如果页面中的绑定事件处理函数越多,执行效率越低,所以要尽量减少处理函数的绑定次数
  • 相关阅读:
    驰骋工作流引擎2016年第1次组团培训日程
    CCBPM中流程回滚的介绍
    CCBPM流程变更处理解决方案与对策
    CCBPM多表单流程中关于绑定表单的设计步骤
    CCBPM关于工作流引擎取回审批的设计方案与实现过程
    线程池 -实现线程复用
    线程安全 -同步锁机制
    匿名内部类创建线程,简化线程创建代码
    Thread -线程的两种创建方式
    Throwable -抛出异常类与自定义异常类
  • 原文地址:https://www.cnblogs.com/zpsylgdx/p/8490654.html
Copyright © 2020-2023  润新知