峰之博纹 - Pelephone个人博客

as3的event里面两个被忽略的方法stopImmediatePropagation,stopPropagation,泡冒…

这段抽时间补脑,重温设计模式,再重读api。发现Event事件里面有几个很有用的东西,而我平时都忽略使用。

首先要说的是stopImmediatePropagation和stopPropagation这两个方法。

文档里面是这么解释的:
stopImmediatePropagation():void 
防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。
stopPropagation():void 
防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。

这样解释有点难懂,上个例子:

package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

public class TestEvent extends Sprite {

public function TestEvent() {
var square_0:Square = new Square(300, 0x336633);
square_0.name = "square_0";
addChild(square_0);

var square_1:Square = new Square(250, 0x669966);
square_1.name = "square_1";
square_0.addChild(square_1);

var square_2:Square = new Square(200, 0x66CC66);
square_2.name = "square_2";
square_1.addChild(square_2);

var square_3:Square = new Square(150, 0xAA0000);
square_3.name = "square_3";
square_3.shouldBubble = false;
square_2.addChild(square_3);

var square_4:Square = new Square(100, 0x66FF66);
square_4.name = "square_4";
square_3.addChild(square_4);

var square_5:Square = new Square(50, 0xCC0000);
square_5.name = "square_5";
square_5.shouldBubble = false;
square_4.addChild(square_5);

this.addEventListener(MouseEvent.CLICK, clickHandler);
}

private function clickHandler(e:Event):void {
trace(">> stage: " + e.type + " event from " + e.target.name + " called on " + this.name);
trace(">> --------------------------------------------");
}
}
}

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

class Square extends Sprite {
private var sideLen:int;
private var color:Number;
public var shouldBubble:Boolean = true;

public function Square(sideLen:int, color:Number) {
this.sideLen = sideLen;
this.color = color;
init();
draw();
}

private function init():void {
buttonMode = true;
this.addEventListener(MouseEvent.CLICK, firstClickHandler);
this.addEventListener(MouseEvent.CLICK, secondClickHandler);
this.addEventListener(MouseEvent.CLICK, thirdClickHandler);
}

private function draw():void {
this.graphics.beginFill(color);
this.graphics.drawRect(0, 0, sideLen, sideLen);
}

//1
private function firstClickHandler(e:Event):void {
trace(">> 1e: " + e.type + " event from " + e.target.name + " called on " + this.name);
if(!shouldBubble) {
e.stopPropagation();
}
}

//2
private function secondClickHandler(e:Event):void {
trace(">> 2e: " + e.type + " event from " + e.target.name + " called on " + this.name);
if(!shouldBubble) {
e.stopImmediatePropagation();
trace(">> --------------------------------------------");
}
}

//3
private function thirdClickHandler(e:Event):void {
trace(">> 3e: " + e.type + " event from " + e.target.name + " called on " + this.name);
}
}

例子中可以看到,square_3的事件冒泡过了stopPropagation后依然还会运行该显示对象的其它方法secondClickHandler,而运行了stopImmediatePropagation后,就不再运行该对象的thirdClickHandler方法了。所以可以看出,stopPropagation会停止事件向上层对象冒泡,但本对象的事件依然会响应,而stopImmediatePropagation不但停止向上层冒泡,连本对象的后续响应会停止。

 

接下来要说的是事件冒泡:bubbles。学会数据结构会听过冒泡排列,不过事件的冒并不是用来排列。从上例代码中已经可以看出,显示对象的冒泡是从子对象的事件一个个向上层对象冒泡遍历。

 

还有一个要补脑的方法是preventDefault,这个方法在文本处理蛮有用.下面是解释.

preventDefault () 方法

public function preventDefault():void

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


如果可以取消事件的默认行为,则取消该行为。

默认情况下,许多事件都有 Flash Player 执行的关联行为。 例如,如果用户在文本字段中键入一个字符,则默认行为就是在文本字段中显示该字符。 由于可以取消 TextEvent.TEXT_INPUT 事件的默认行为,因此您可以使用 preventDefault() 方法来防止显示该字符。

不可取消行为的一个示例是与 Event.REMOVED 事件关联的默认行为,只要 Flash Player 从显示列表中删除显示对象,就会生成该事件。 由于无法取消默认行为(删除元素),因此 preventDefault() 方法对此默认行为无效。

您可以使用 Event.cancelable 属性来检查是否可以防止与特定事件关联的默认行为。 如果 Event.cancelable 的值为 true,则可以使用 preventDefault() 来取消事件;否则,preventDefault() 无效。

 

posted @ 2012-02-23 17:33  Pelephone  阅读(2795)  评论(0编辑  收藏  举报