移除由MXML标签添加的侦听

在flex中我们可以很方便的在mxml标签中使用事件名="函数名()"来给对象添加侦听..
click="goUrl()"

可是当我们不需要该侦听的时候..
如果想使用
id.removeEventListener("click",goUrl)来删除侦听.
却发现怎么也remove不成功..

原来使用该方法给对象添加侦听时..
flex并不是直接使用我们指定的函数(goUrl),
而是先动态生成一个函数.
然后再使用该函数调用我们指定的函数..

所以我们使用id.removeEventListener("click",goUrl)当然就失败了...

正当ym的时候..记得之前使用过状态(state)来移除过这样的侦听..
马上试了下一下..

1.<mx:states>
2.    <mx:State name="statename">
3.        <mx:SetEventHandler target="{obj}" name="click"/>
4.    </mx:State>
5.</mx:states>



运行了一下..果然成功了..
无耐之前只好把swf反编译一下...终于在代码里看到了
一个叫"__obj_click"的函数..

猜想这个应该就是由flex动态添加的函数..于是试了一下...
obj.removeEventListener("click",this["__obj_click"]);
//这里需要注意..为什么不直接使用__obj_click
而使用this["__obj_click"],
因为当flex编译时..__obj_click 这个函数还不存在,直接调用会出错..所以取巧一下..

保存运行..侦听成功删除...猜想正确...
分析一下该函数的规律..
第一部份是"__"
第二部份是对象ID
第三部份是"_"
第四部份是事件名

相应的
mouseOver事件就是__obj_mouseOver
mouseDown事件就是__obj_mouseDown

一个例子...简单的三个鼠标事件..没有进行大范围的测试..至少鼠标事件是ok了..详细就不多说了..

01.<?xml version="1.0" encoding="utf-8"?>
02.<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #FFFFFF]" width="400" height="300" fontSize="12">
03.    <mx:Script>
04.        <![CDATA[
05.            private function func(e:MouseEvent):void
06.            {
07.                t.text = e.type+":"+e.localX+","+e.localY;
08.            }
09.            private function remove():void
10.            {
11.                c.removeEventListener("click",this["__c_click"]);
12.                c.removeEventListener("mouseMove",this["__c_mouseMove"]);
13.                c.removeEventListener("rollOut",this["__c_rollOut"]);
14.                t.text = "事件已经移除"
15.            }
16.        ]]>
17.    </mx:Script>
18.    <mx:Canvas id="c" click="func(event);" mouseMove="func(event);" rollOut="func(event);" x="10" y="10" width="200" height="280" borderStyle="none" backgroundColor="#333333">
19.    </mx:Canvas>
20.    <mx:Text id="t" x="218" y="10" width="172" height="250"/>
21.    <mx:Button x="218" y="268" label="remove event" click="remove()"/>
22.</mx:Application>


测试说明:
先在灰色的块中移动,单击,移出测试事件..
然后点击"remove event"后..
再回来灰色块中..试试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值