术语定义
1.事件流描述的是从页面中接收事件的顺序,也可理解为事件在页面中传播的顺序。
2.事件就是用户或浏览器自身执行的某种动作。诸如click(点击)、load(加载)、mouseover(鼠标悬停)。
3.事件处理程序响应某个事件的函数就叫事件处理程序(或事件侦听器)。


事件流描述的是从页面中接受事件的顺序,但有意思的是,

IE和Netscape开发团队居然提出了两个截然相反的事件流概念:

  • IE的事件流是事件冒泡流;

  • 而Netscape的事件流是事件捕获流;

IE的事件流是冒泡, 从里面往上面冒, netscape是从外部元素往内部元素捕获;


DOM2级的事件规定了事件流包含三个阶段包括: 1:事件捕获, 2:处于目标阶段, 3:事件冒泡阶段(IE8以及更早版本不支持DOM事件流); 无论在DOM0还是DOM2还是DOM3中都会在事件函数中传入事件对象;

  • 捕获阶段(event  capturing):在事件冒泡的模型中,捕获阶段不会响应任何事件;

    通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会从根节点开始由外到内进行事件传播,即点击了子元素,如果父元素通过事件捕获方式注册了对应的事件的话,会先触发父元素绑定的事件。

  • 目标阶段:目标阶段就是指事件响应到触发事件的最底层元素上;

  • 冒泡阶段(dubbed  bubbling):冒泡阶段就是事件的触发响应会从最底层目标一层层地向外到最外层(根节点),事件代理即是利用事件冒泡的机制把里层所需要响应的事件绑定到外层;


无论是事件捕获还是事件冒泡,它们都有一个共同的行为,就是事件传播,它就像一跟引线,只有通过引线才能将绑在引线上的×××(事件监听器)引爆,试想一下,如果引线不导火了,那×××就只有一响了!

理解:javascript事件捕获 与 事件冒泡_第1张图片

DOM2级事件'定义了两个方法,

用于处理指定和删除事件处理程序的操作:addEventListener()removeEventListener()


说到事件冒泡与捕获就不得不提一下两个用于事件绑定的方法addEventListenerattachEvent。当然还有其它的事件绑定的方式这里不做介绍。

  addEventListener(event, listener, useCapture)  

参数定义:


    • event---(事件名称,如click,不带on),

    • listener---事件监听函数,

    • useCapture---是否采用事件捕获进行事件捕捉(默认为false,即采用事件冒泡方式)

   addEventListener在 IE11、Chrome 、Firefox、Safari等浏览器都得到支持。

  attachEvent(event,listener)  

参数定义:


    • event---(事件名称,如onclick,带on)

    • listener---事件监听函数。

   attachEvent主要用于IE浏览器,并且仅在IE10及以下才支持,IE11已经废了这个方法了(微软还是挺识趣的,慢慢向标准靠拢)。

下面就用上面这两个方法通过子来解释一下事件捕获与事件冒泡的具体表现行为差异,

事件冒泡 

例1:



    
    js事件机制
    
    

    
        父元素
        
            子元素