• js事件流


    两种事件流事件捕获和事件冒泡

    冒泡事件流

    当事件在某一DOM元素被触发时,例如用户在客户名字节点上点击鼠标,事件将跟随着该节点继承自的各个父节点冒泡穿过整个的DOM节点层次,直到它遇到依附有该事件类型处理器的节点,此时,该事件是onclick事件。在冒泡过程中的任何时候都可以终止事件的冒泡,在遵从W3C标准的浏览器里可以通过调用事件对象上的stopPropagation()方法,在Internet Explorer里可以通过设置事件对象的cancelBubble属性为true。如果不停止事件的传播,事件将一直通过DOM冒泡直至到达文档根。
    如果想创建一个捕捉事件,在支持W3C 事件模型的浏览器中,将addEventListener的第三个参数设为true就好了。例如:
    前一阵因为想弄懂事件捕捉,所以做了点小实验,分别在Firefox 2、Safari 3 on Windows和Opera 9上实践了事件捕捉(当然,因为IE不支持事件捕捉,所以…),实验的原理见下图:
    ID为div1和div2的两个元素都被委派了捕捉阶段的事件处理函数,这样:
    当点击#div1(蓝色区域)时,应该会alert出”div1″
    当点击#div2(黄色区域)时,应该会先alert出”div1″,再alert出”div2″,因为在事件捕捉阶段,事件是从根元素向下传播的,#div1是#div2的父元素,自然绑定在#div1上的click事件也会先于#div2上的click事件被执行
    然而,以上的设想只适用于Firefox 2和Safari 3 on Windows,在Opera 9中,事情会变成这样:
    当点击#div1(蓝色区域)时,什么都不会发生
    当点击#div2(黄色区域)时,会alert出”div1″,随后什么都不会再发生
     

    捕获事件流

    事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有祖先元素依次往下传递。在这个过程中,事件会被从文档根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useCapture属性为true,那么它们可以被分派给这期间的任何元素以对事件做出处理;否则,事件会被接着传递给派生元素路径上的下一元素,直至目标元素。事件到达目标元素后,它会接着通过DOM节点再进行冒泡。
    事件流描述的是从页面中接收事件的顺序,也可理解为事件在页面中传播的顺序。
    事件流主要分为两种,即事件捕获和事件冒泡,这二者接受事件处理的顺序不同。假设下面的代码:
    <body>
        <div id="outer">
            <div id="inner"></div>
        </div>
    </body>12345
    这两个事件流分别的是IE公司和netspace公司提出来的,冒泡事件流支持的浏览器更多。
    冒泡事件流中,事件的传递顺序是从子元素向父元素传递。假设我们给div绑定一个click事件。那么在冒泡事件流中,事件的传递顺序是:inner->outer->body。然而捕获事件流的顺序则截然想法:body->outer->innner。
    DOM事件流
    DOM2级事件规定事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。还是以上面的代码为例,单击inner则会按照下面的顺序触发事件:document->html->body->outer->ineer->outer->body->html->document。在DOM事件流中,实际的目标inner在捕获阶段不会接受到事件。这意味着在捕获阶段,事件到outer就停止了,下一个阶段是“处于目标”阶段,于是事件在inner 上发生,并在事件处理中呗看成是冒泡阶段的一部分。然后,冒泡阶段发生,事件又传播回文档。
    事件处理程序
    响应某个时间的函数叫做事件处理程序。DOM0级的事件处理程序很简单,onclick就是常用的DOM0级事件处理函数,只会在冒泡阶段被处理。
    而DOM2级事件定义了两个方法用于处理置顶和删除事件处理程序的操作addEventListener()和removeEventListener(),所有DOM节点都包含这两个方法,并且它们都接受3个参数:要处理的事件名,作为事件处理的函数和一个布尔值。最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序,反之则是在事件冒泡阶段处理程序。DOM2级方法添加事件处理程序的好处是可以添加多个事件处理程序,会按照添加顺序被处理(无论是捕获还是冒泡)。
    而IE不同的它有自己的方法attachEvent()和detachEvent,这两个接受相同的两个参数:事件处理程序名称和事件处理程序函数。
    跨浏览器的事件处理程序
     
    var EventUtil = {
        addHandler: function(element,type,handler) {
            if (element.addEventListener) {
                element.addEventListener(type,handler,false);
            }
            else if (element.attachEvent) {
                element.attachEvent('on'+type,handler);
            }
            else {
                element['on'+type] = handler;
            }
        },
        removeHandler: function(element,type,handler) {
            if (element.removeEventListener)
            {
                element.removeEventListener(type,handler,false);
            }
            else(element.detachEvent) {
                element.detachEvent('on' +type,handler);
            }
            else {
                element['on'+type] = null;
            }
        }
    }
  • 相关阅读:
    第三部分:填写志愿的思路
    第二部分:志愿录取标准
    2017年浙江省高考志愿、录取闪电入门系列 目录
    七、程序包
    五、过程式编程和调试技巧
    四、表达式的计算
    三、函数与递归
    二、表操作
    一、MMA概述
    Java面向对象
  • 原文地址:https://www.cnblogs.com/ambitious-to-49/p/10187297.html
Copyright © 2020-2023  润新知