大家在开发过程中一定遇到父对象中包含子对象,点击子对象,父对象的监听也会触发的情况,很是头疼
通常解决办法是在子对象的事件加入
event.stopPropagation(),这样父类的监听就不会触发,但是如果界面组件很多,写起来会很苦恼,
下面介绍个一劳永逸的解决办法,同时拥有释放对象时一次性清空监听事件的功能
//声明一个事件字典
var _EventArr:Dictionary
//继承添加监听事件函数
override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
{
if( !_EventArr )
_EventArr = new Dictionary();
if( _EventArr[listener] == null )
{
override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
{
if( !_EventArr )
_EventArr = new Dictionary();
if( _EventArr[listener] == null )
{
super.addEventListener(type,OnEvent,useCapture,priority,useWeakReference);
_EventArr[listener] =type;
}
}
_EventArr[listener] =type;
}
}
//自定函数,阻止冒泡事件
private function OnEvent(event:Object):void
{
event.stopImmediatePropagation()
for (var fun:Function in _EventArr)
if (_EventArr[fun]==event.type)
fun(event)
}
private function OnEvent(event:Object):void
{
event.stopImmediatePropagation()
for (var fun:Function in _EventArr)
if (_EventArr[fun]==event.type)
fun(event)
}
//继承移除监听事件
override public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void
{
if (_EventArr)
if (_EventArr[listener])
{
super.removeEventListener(type,listener,useCapture)
delete _EventArr[listener];//删除该侦听器记录
//trace(this,"删除侦听");
}
}
override public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void
{
if (_EventArr)
if (_EventArr[listener])
{
super.removeEventListener(type,listener,useCapture)
delete _EventArr[listener];//删除该侦听器记录
//trace(this,"删除侦听");
}
}
//清空监听事件
private function clearEventListener():void
{
for (var listener:Function in _EventArr)
removeEventListener(_EventArr[listener], listener);
_EventArr=null
}
private function clearEventListener():void
{
for (var listener:Function in _EventArr)
removeEventListener(_EventArr[listener], listener);
_EventArr=null
}