javascript事件传播

  在0级API中,通过在html中设置属性或者在javascript代码中设置对象的属性,来注册事件句柄。在2级事件模型中,可以调用对象的addEventListener()方法为特定元素注册事件句柄(Dom标准API中称之为监听器,在这我们用-句柄)。

  在0级DOM事件模型中,浏览器把事件分派给发生事件的文档元素。如果那个对象具有适合的事件句柄,就运行这个句柄。除此之外,不用执行其他操作。

  (有客观要问了为什么没有1级事件模型? 答曰:DOM级别1于1998年10月1日成为W3C推荐标准。1级DOM标准中并没有定义事件相关的内容,所以没有所谓的1级DOM事件模型。在2级DOM中除了定义了一些DOM相关的操作之外还定义了一个事件模型 ,这个标准下的事件模型就是我们所说的2级DOM事件模型);

  在2级DOM中,情况要复杂的多,当事件发生在文档元素上(事件目标)时,目标事件句柄就被触发。此外,目标的每个祖先也机会处理那个事件。事件传播分三个阶段:

  1. 在捕捉阶段,事件从document对象沿着文档树向下传播给目标节点。如果目标的任何一个祖先注册了捕捉事件句柄,那么在事件传播的过程中,就会运行这些句柄
  2. 发生在目标节点自身,这与0级事件模型提供的事件处理方法类似。
  3. 就是传说中的气泡阶段,在这个阶段,事件将从目标元素向上传播回(像冒泡)Document对象的文档层次。例外:<form>元素的提交事件不起泡(当然也没什么用)。一般来说,原始事件起泡,而高级语义事件不气泡

  任何事件句柄都可以调用表示那个事件的Event对象的stopPropagation()方法,停止事件传播。

  有些(注意是有些,可不是任何)事件会引发浏览器执行默认动作。例如点击<a>时,浏览器默认动作是执行超链接。这样的默认动作只在三个事件传播阶段都完成之后执行,事件传播过程中调用的任何事件句柄都可调用Event对象的preventDefault()方法阻止默认动作的发生。

  2级dom以一种独立语言的方式编写,并且明确了事件监听器是对象而不是简单的函数,可是标准没有指名this关键字的值。所有知名的实现都使用addEventListener()来调用句柄注册,就好像他们是目标元素的方法一样。也就是说,当句柄被调用的时候,this关键字所引用的对象正是在其上注册了这个句柄对象。如果不希望依赖这个中不确定的行为,可以使用传递给句柄的Event对象的属性currentTarget,currentTarget属性引用一个对象,该对象注册了事件句柄。

  

 

posted @ 2013-05-25 20:00  that  阅读(616)  评论(0编辑  收藏  举报