如何正确监听Stage对象的事件·续
如果想在一个自定义类中注册对stage对象的监听事件,然后在另一个文档类中使用该类的实例,this.stage为null,正确做法应该如下:
package{ import flash.display.Sprite; import flash.events.Event; public class MyClass extends Sprite{ public function MyClass(){ trace(stage);//输出null addEventListener(Event.ADDED_TO_STAGE,AddedToStageHandler); } function AddedToStageHandler(e:Event):void{ trace(stage);//这时才能获得stage引用 stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler); } } }
然后把它实例化后显示出来
var myClass:MyClass = new MyClass(); addChild(myClass);//添加到显示列表 removeChild(myClass);//从显示列表中删除该对象
这种情况下,程序运行是正常的。
再来看一种情况
package{ import flash.display.Sprite; import flash.events.Event; public class MyClass extends Sprite{ public function MyClass(){ trace(stage);//输出null addEventListener(Event.ADDED_TO_STAGE,AddedToStageHandler); } function AddedToStageHandler(e:Event):void{ trace(stage);//这时才能获得stage引用 stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler); addEventListener(Event.ENTER_FRAME, onLoop); } function onLoop(e:Event):void { var y=stage.stageHeight;//这里引用了stage对象 } } }
然后把它实例化后显示出来
var myClass:MyClass = new MyClass(); addChild(myClass);//添加到显示列表 removeChild(myClass);//从显示列表中删除该对象 //报错了
原因是removeChild(myClass)后,myClass的onLoop方法所持有的stage未null了,正确的做法如下
package{ import flash.display.Sprite; import flash.events.Event; public class MyClass extends Sprite{ public function MyClass(){ trace(stage);//输出null addEventListener(Event.ADDED_TO_STAGE,AddedToStageHandler); addEventListener(Event.REMOVED_FROM_STAGE,RemovedToStageHandler);//增加侦听移除Stage事件 } function AddedToStageHandler(e:Event):void{ trace(stage);//这时才能获得stage引用 stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler); addEventListener(Event.ENTER_FRAME, onLoop); } function onLoop(e:Event):void{ var y=stage.stageHeight;//这里引用了stage对象 } function RemovedToStageHandler(e:Event):void{ removeEventListener(Event.ENTER_FRAME, onLoop); } } }