DFdou's Blog Life is short,Be yourself.

703/096

AS3-用addEventListener()方法的useCapture参数控制事件流

估计不少人都没用过addEventListener()方法的参数,我就是其中一个。
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
useCapture:Boolean(default = false)确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。 如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。 如果 useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。用这个参数搭配stopPropagation()/stopImmediatePropagation()可以做些很偏门的事。
Demo如下,(注:层次关系是mc1.mc2.mc3):


代码部分:

mcNoUseCapture.mc1.addEventListener (MouseEvent.CLICK,mc1Clk);
mcNoUseCapture.mc1.mc2.addEventListener (MouseEvent.CLICK,mc2Clk);
mcNoUseCapture.mc1.mc2.mc3.addEventListener (MouseEvent.CLICK,mc3Clk);
mcUseCapture.mc1.addEventListener (MouseEvent.CLICK,umc1Clk);
mcUseCapture.mc1.mc2.addEventListener (MouseEvent.CLICK,umc2Clk,true);
mcUseCapture.mc1.mc2.mc3.addEventListener (MouseEvent.CLICK,umc3Clk);
btnReset.addEventListener (MouseEvent.CLICK,txtReset);
function mc1Clk (_evt:MouseEvent) {
	txtRsOutput.appendText ("mcNoUseCapture mc1 click +++++");
}
function mc2Clk (_evt:MouseEvent) {
	txtRsOutput.appendText ("mcNoUseCapture mc2 click +++++");
}
function mc3Clk (_evt:MouseEvent) {
	txtRsOutput.appendText ("mcNoUseCapture mc3 click +++++");
}

function umc1Clk (_evt:MouseEvent) {
	txtRsOutput.appendText ("mcUseCapture mc1 click +++++");
}
function umc2Clk (_evt:MouseEvent) {
	txtRsOutput.appendText ("mcUseCapture mc2 click +++++");
	_evt.stopImmediatePropagation(); //有2个方法阻止冒泡stopPropagation() and stopImmediatePropagation() 2者的区别请参考as3帮助文档
}
function umc3Clk (_evt:MouseEvent) {
	txtRsOutput.appendText ("mcUseCapture mc3 click +++++");
}

function txtReset (_evt:MouseEvent) {
	txtRsOutput.text="";
}

左边那个是没有用useCapture参数的,点击最里层的mc3,就会触发mc3的点击事件,然后是冒泡阶段,触发mc2,mc1的点击事件。
而右边则在mc2的addEventListener()里使用了useCapture参数,于是点击mc2后在捕获阶段就触发了点击事件,如果umc2Clk里没有_evt.stopImmediatePropagation(),那么接下去触发的是mc3的点击事件和mc1的点击事件,但是umc2Clk里有_evt.stopImmediatePropagation(),那么mc3的点击事件就被阻止了。
假设用户点击了mc3,正常的流程应该是这样,先是捕获阶段,从mc1开始,接着是mc2,然后到目标mc3,执行mc3Clk,接着是冒泡阶段,执行mc2Clk,mc1Clk。
在mc2里useCapture=true之后,到mc2的地方,就执行umc2Clk,因为umc2Clk里使用了_evt.stopImmediatePropagation(),mc3的事件流被阻止。
话说回来,这个效果应该没什么用途吧,除了知道addEventListener()的参数。
priority参数如其名,就是权重,高的先执行,用了下没想象中的效果,不知道具体用法。

Some Related Posts

Comments (6) Trackbacks (0)
  1. :zhuang

    [Reply]

    Anonymous Reply:

    @,

    [Reply]

    Anonymous Reply:

    @, :dahan :dahan :dahan :byebye

    DFdou Reply:

    @, :dahan


Leave a comment

:zhuang :xizao :wuwu :wenhao :wc :touxiang :shuaya :shuajian :shengtian :paopao :no :meinv :maonv :loveu :leilei :kua :jrjr :dahan :chi :chaocai :byebye


CommentLuv badge

No trackbacks yet.