一:使用方法:
1172: 找不到定义 flash.events.Event:ADDED_TO_STAGE。
今天在文档类中初始化一个自定义类是,遇上了上面的错误,仔细考虑才发现可能在自定义类中定位一个区位交通图,获取stage.stageWidth和stage.stageHeight的时候引发了该错误,我分析可能和舞台加载顺序有关,因为只有自定义类被添加到舞台上,才能获得相关的stage的信息。找到了原因,就有解决的办法,就是用DisplayObject类的Event.ADDED_TO_STAGE。具体如下:
import flash.events.Event;
package cn.kwoky.library{
public class Emap extends Sprite {
public function Emap ():void
{
this.addEventListener (Event.ADDED_TO_STAGE,init);//侦听类是否被添加到了舞台
}
}
private function init (e:Event=null):void
{
removeEventListener (Event.ADDED_TO_STAGE,init);
trace(stage.stageWidth,stage.stageHeight);
}在这里,关键是通过ADDED_TO_STAGE事件,来侦听该类是否被添加到了舞台显示列表,如果已经被添加,就会触发該事件,然后就可以使用stage相关的信息了。
二:关于ADDED_TO_STAGE执行再次的解决
addEventListener(Event.ADDED_TO_STAGE, StageReady);
public function StageReady(e:Event):void{ trace("stage ready");init();stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownListener); button.addEventListener(MouseEvent.CLICK, clickHandler); }我们通常会在构造函数中添加这个监听器, 然后再执行初始化函数。因为如果舞台还未初始化完成,就无法使用stage属性,比如添加键盘监听就无法添加。
但是当我们使用这个监听器的时候一定要小心。因为他有十分隐蔽的问题。stageReady函数中的代码可能被两次,三次执行。等多次数还未遇到。原因这篇文章再不做阐述。
如上面的代码,键盘监听被加载了多次,按钮的监听也被加载了多次。如果新建的实例,也会被多次创建。之所以说这个bug隐蔽是因为,这种问题不会报错。
通常AS3的监听器是需要我们手动去掉的,如果不去掉将会导致效率降低,所以我们会写:
public function ClearUp():void{
stage.removeEventListener(KeyboardEvent.KEY_DOWN,KeyDownListener); button.removeEventListener(MouseEvent.CLICK, clickHandler); }如果stageReady中的监听器被加载了两次,那么在ClearUp函数中,你写两遍removeEventListener也不会报错。因为的确有两监听器。
但是对于可视化的原件等等多的被多次创建的元素呢?会产生更多的问题
所以要做的是不要让stageReady运行多次。
所以应该在stageReady中的第一句话写上:removeEventListener(Event.ADDED_TO_STAGE, StageReady);这样就可以防止多次运行了。经过多次试验,目前还没有出现过新的bug