addListener添加事件监听器,第三个参数useCapture (Boolean) 的作用

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

<div id="outDiv">
<div id="middleDiv">
<div id="inDiv">请在此点击鼠标。</div>
</div>
</div>

<div id="info"></div>
var outDiv = document.getElementById("outDiv");
var middleDiv = document.getElementById("middleDiv");
var inDiv = document.getElementById("inDiv");
var info = document.getElementById("info");

outDiv.addEventListener("click", function () { info.innerHTML += "outDiv" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "middleDiv" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "inDiv" + "<br>"; }, 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,则内层的触发先于外层。

2009-05-05 上午 10:18
http://www.haishabei.net/article.asp?id=117
public
override function addEventListener(type:String, listener:Function,
useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean =
false):void

语言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 可以为特定类型的事件、阶段和优先级在显示列表的所有节点上注册事件侦听器。
成功注册一个事件侦听器后,无法通过额外调用 addEventListener() 来更改其优先级。 要更改侦听器的优先级,必须首先调用 removeListener()。 然后,可以使用新的优先级再次注册该侦听器。

请记住,注册该侦听器后,如果继续调用具有不同 type 或 useCapture 值的
addEventListener(),则会创建单独的侦听器注册。 例如,如果首先注册 useCapture 设置为 true
的侦听器,则该侦听器只在捕获阶段进行侦听。 如果使用同一个侦听器对象再次调用 addEventListener(),并将 useCapture
设置为 false,那么便会拥有两个单独的侦听器:一个在捕获阶段进行侦听,另一个在目标和冒泡阶段进行侦听。

不能只为目标阶段或冒泡阶段注册事件侦听器。 这些阶段在注册期间是成对出现的,因为冒泡阶段只适用于目标节点的始祖。

如果不再需要某个事件侦听器,可调用 removeEventListener() 删除它,否则会产生内存问题。 由于垃圾回收器不会删除仍包含引用的对象,因此不会从内存中自动删除使用已注册事件侦听器的对象。

复制 EventDispatcher 实例时并不复制其中附加的事件侦听器。 (如果新近创建的节点需要一个事件侦听器,必须在创建该节点后附加该侦听器)。 但是,如果移动 EventDispatcher 实例,则其中附加的事件侦听器也会随之移动。

如果在正在处理事件的节点上注册事件侦听器,则不会在当前阶段触发事件侦听器,但会在事件流的稍后阶段触发,如冒泡阶段。

如果从正在处理事件的节点中删除事件侦听器,则该事件侦听器仍由当前操作触发。 删除事件侦听器后,决不会再次调用该事件侦听器(除非再次注册以备将来处理)。

参数 type:String — 事件的类型。

listener:Function — 处理事件的侦听器函数。 此函数必须接受 Event 对象作为其唯一的参数,并且不能返回任何结果,如以下示例所示:
function(evt:Event):void

函数可以有任何名称。

useCapture:Boolean (default = false) — 确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。
如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。 如果 useCapture 为
false,则侦听器只在目标或冒泡阶段处理事件。 要在所有三个阶段都侦听事件,请调用两次 addEventListener,一次将
useCapture 设置为 true,第二次再将 useCapture 设置为 false。

priority:int (default = 0) — 事件侦听器的优先级。 优先级由一个带符号的 32 位整数指定。
数字越大,优先级越高。 优先级为 n 的所有侦听器会在优先级为 n -1 的侦听器之前得到处理。
如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。 默认优先级为 0。

useWeakReference:Boolean (default = false) — 确定对侦听器的引用是强引用,还是弱引用。 强引用(默认值)可防止您的侦听器被当作垃圾回收。 弱引用则没有此作用。

级别成员函数不属于垃圾回收的对象,因此可以对类级别成员函数将 useWeakReference 设置为 true 而不会使它们受垃圾回收的影响。
如果对作为嵌套内部函数的侦听器将 useWeakReference 设置为 true,则该函数将被作为垃圾回收并且不再是永久函数。
如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。

源自:http://hi.baidu.com/ls_mcx/blog/item/203febd9efdc633f32fa1c40.html

时间: 2024-10-12 10:50:22

addListener添加事件监听器,第三个参数useCapture (Boolean) 的作用的相关文章

HTML5开发之旅WebSocket添加事件监听器(6)

WebSocket编程遵循异步编程模型;打开socket后,只需要等待事件发生,而不需要主动向服务器轮询,所以需要在WebSocket对象中添加回调函数来监听事件. WebSocket对象有三个事件:open,close和message.当连接建立时触发open事件,当收到消息时触发message事件,当 WebSocket连接关闭时触发close事件.同大多数Javascript API一样,事件处理时会调用相应的(onopen, onmessage, 和onclose)回调函数. 1 w.o

cocos2d-x之为label添加事件监听器,单点触摸

在bool HelloWorld::init() 1 //获取可见区域的大小 2 Size visibleSize = Director::getInstance()->getVisibleSize(); 3 //定义一个文本,显示内容 4 auto label = LabelTTF::create("Chick me", "Courier", 30); 5 //定义label的位置 6 label->setPosition(Point(visibleS

js-addEventListener()第三个参数useCapture

概述: 第3个参数叫做useCapture,是一個boolean值,就是true or false .如果送出true的話就是瀏覽器會使用Capture方式,false的話是Bubbling,只有在特定狀況下才會有影響,通常建議是false,而會有影響的情形是目標元素(target element)有祖先元素(ancestor element),而且也有同樣的事件對應函數 html片段 <div id="div1" style="background: blue;wid

快速添加事件监听器到管理器

cc.eventManager.addListener({ event: cc.EventListener.TOUCH_ALL_AT_ONCE, onTouchesMoved: function (touches, event) { var touch = touches[0]; var delta = touch.getDelta(); var node = event.getCurrentTarget().getChildByTag(TAG_TILE_MAP); var diff = cc.

js添加事件处理程序

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>robot</title> <script> //添加事件处理程序 //传入三个参数分别为事件名称.处理程序.是否要让事件向上传递 window.addEventListener("load", init, false); f

js中addEventListener第三个参数涉及到的事件捕获与冒泡

js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型,比如点击(click).触摸(touchstart), 第二个参数就是事件函数, 比如我给一个button添加alert函数. window.onload=function(){ document.getElementById("hello").addEventListener("

dom添加事件总结

碰到几个问题,总结一下: 什么是事件冒泡 被点击后,由最具体的事件接收,逐级向上传至最不具体的那个节点 事件流 描述页面接收事件的顺序 分为html事件,DOM0级事件,DOM2级事件 DOM 0级与html事件需要加上on,DOM2在非ie下不需要,因为已经有了listen这个监听的东西,在ie下DOM2的attachEvent和detatchEvent需要加上on 注意: Internet Explorer 8 及更早IE版本不支持 addEventListener() 方法,,Opera

Android笔记二十三.Android基于事件监听器处理机制

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.Android的事件处理 Android事件处理包括两个部分:Android事件处理机制(基本)和Android消息传递机制(进阶).前者包含三种处理方式,即基于监听的事件处理.基于回调的事件处理.直接绑定到标签;后者包含两种处理方式,即Handler消息传递.异步任务处理. 1.Android的事件处理机制 (1)基于监听的事件处理方式 通常做法是为Android界面组件绑定特定的事件监听

js原生添加事件的方式

js原生添加事件的方式: 1. 直接在html标签上添加 <div onclick="alert('div')">div</div> 2. 用dom的on...方法添加 document.getElementById('div').onclick = function () {alert('div')}; 3. 用addEventListener或attachEvent添加 document.getElementById('div').addEventListe