javascript addEventListener用法(转载)

javascript addEventListener用法(转载)

  (2012-10-29 14:21:59)
标签: 

杂谈

分类: 计算机与 Internet

addEventListener 用于注册事件处理程序,IE 中为attachEvent,我们为什么讲 addEventListener 而不讲 attachEvent 呢?一来 attachEvent 比较简单,二来 addEventListener 才是 DOM 中的标准内容。

简介

addEventListener 为文档节点、document、window 或 XMLHttpRequest 注册事件处理程序,在以前我们一般是 click="...",或 document.getElementByIdx_x("testButton").onclick = FuncName, 而在 DOM 中,我们用 addEventListener(IE 中用 attachEvent)。

语法

target.addEventListener(type, listener, useCapture);
  • target 文档节点、document、window 或 XMLHttpRequest。
  • type 字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。
  • listener 实现了 EventListener 接口或者是 JavaScript 中的函数。
  • useCapture 是否使用捕捉,看了后面的事件流一节后就明白了,一般用 false。

示例

function Go()
{
       //...
}

document.getElementByIdx_x("testButton").addEventListener("click", Go, false);

或者 listener 直接就是函数

document.getElementByIdx_x("testButton").addEventListener("click", function () { ... }, false);

 

 addEventListener-事件流

说到 addEventListener 不得不说到事件流,先说事件流对后面的解释比较方便。

当一个事件发生时,分为三个阶段:

捕获阶段 从根节点开始顺序而下,检测每个节点是否注册了事件处理程序。如果注册了事件处理程序,并且 useCapture 为 true,则调用该事件处理程序。(IE 中无此阶段。)

目标阶段 触发在目标对象本身注册的事件处理程序,也称正常事件派发阶段

冒泡阶段 从目标节点到根节点,检测每个节点是否注册了事件处理程序,如果注册了事件处理程序,并且 useCapture 为 false,则调用该事件处理程序。

举例


 

     

         

         

     

 

如果在 d3 上点击鼠标,事件流是这样的:

捕获阶段 在 div1 处检测是否有 useCapture 为 true 的事件处理程序,若有,则执行该程序,然后再同样地处理 div2。

目标阶段 在 div3 处,发现 div3 就是鼠标点击的节点,所以这里为目标阶段,若有事件处理程序,则执行该程序,这里不论 useCapture 为 true 还是 false。

冒泡阶段 在 div2 处检测是否有 useCapture 为 false 的事件处理程序,若有,则执行该程序,然后再同样地处理 div1。

注意,上述捕获阶段和冒泡阶段中,实际上 div1 之上还应该有结点,比如有 body,但这里不讨论。

 

addEventListener-第三个参数 useCapture

 

addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click");第二个参数表示要接收事件处理的函数;第三个参数为 useCapture,本文就讲解它。


 

     
请在此点击鼠标。

 



 

var outDiv = document.getElementByIdx_x("outDiv");
var middleDiv = document.getElementByIdx_x("middleDiv");
var inDiv = document.getElementByIdx_x("inDiv");
var info = document.getElementByIdx_x("info");
 
outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "
"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "
"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "
"; }, false);

上述是我们测试的代码,根据 info 的显示来确定触发的顺序,有三个 addEventListener,而 useCapture 可选值为 true 和 false,所以 2*2*2,可以得出 8 段不同的程序。

  • 全为 false 时,触发顺序为:inDiv、middleDiv、outDiv;
  • 全为 true 时,触发顺序为:outDiv、middleDiv、inDiv;
  • outDiv 为 true,其他为 false 时,触发顺序为:outDiv、inDiv、middleDiv;
  • middleDiv 为 true,其他为 false 时,触发顺序为:middleDiv、inDiv、outDiv;
  • ……

最终得出如下结论:

  • true 的触发顺序总是在 false 之前;
  • 如果多个均为 true,则外层的触发先于内层;
  • 如果多个均为 false,则内层的触发先于外层。

下面提供全部代码,您可以更改其中的 true、false 值,来进行测试。注意,不适用于 IE。
 

[html]  view plain copy
  1. >  
  2. <</span>html xmlns="http://www.w3.org/1999/xhtml">  
  3.   
  4. <</span>head>  
  5. <</span>meta http-equiv="Content-Language" content="zh-cn" />  
  6. <</span>meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  7. <</span>title>useCapture</</span>title>  
  8. <</span>style type="text/css">  
  9. #outDiv  
  10.  
  11.     padding:10px 10px 10px 10px;  
  12.     border:1px solid red;  
  13.  
  14.   
  15. #middleDiv  
  16.  
  17.     padding:10px 10px 10px 10px;  
  18.     border:1px solid green;  
  19.  
  20.   
  21. #inDiv  
  22.  
  23.     padding:10px 10px 10px 10px;  
  24.     border:1px solid blue;  
  25.  
  26. </</span>style>  
  27. </</span>head>  
  28.   
  29. <</span>body>  
  30.   
  31. <</span>div id="outDiv">  
  32.   <</span>div id="middleDiv">  
  33.     <</span>div id="inDiv">请在此点击鼠标。</</span>div>  
  34.   </</span>div>  
  35. </</span>div>  
  36.   
  37. <</span>div id="info"></</span>div>  
  38.   
  39. <</span>script language="javascript" type="text/javascript">  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值