stage监听键盘事件被另外的swf加载后失效的解决方

25次阅读


if (stage) { 
stage.addEventListener(KeyboardEvent.KEY_DOWN,mykeydown) 
} else { 
addEventListener(Event.ADDED_TO_STAGE, aaa); 

function aaa(event:Event):void { 
removeEventListener(Event.ADDED_TO_STAGE, aaa); 
stage.addEventListener(KeyboardEvent.KEY_DOWN,mykeydown) 
}  

function mykeydown(evt:KeyboardEvent):void 

…… 

/////////////////////////////

很多时候,可视类初始化的时候,要用到 stage 属性,则必须使用 Event.ADDED_TO_STAGE 事件,有的时候,连文档类初始化时,也需要用到 Event.ADDED_TO_STAGE,原因是这个 swf 将被其它的文件加载,如果直接在初始化函数内使用 stage 属性,单独发布是没问题的,但联调时就会发生问题。

但是,文档类初始化函数内的 Event.ADDED_TO_STAGE,当这个 swf 被其他文件加载时,很有可能被触发两次,如果你将所有真正的初始化代码都写在 Event.ADDED_TO_STAGE 事件相应函数内,所有的可视化元素,将会被 new 出来两份,所有的侦听,将会有两份 …

这个现象很隐蔽,往往发生了也不报错,从表面上也看不出问题,但一旦发生,轻则降低机器性能,重则会发生很多灵异事件,例如明明把某个元素 visible 设成 false 了,但屏幕上还是能看到它,原因就是 new 出来东西,都将有两份。

Event.ADDED_TO_STAGE 被广播两次的原因,可能是文档类的特殊性造成的,它自己初始化的时候被触发一次,被加载并显示的时候再触发一次。

正文完