在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"后..
再回来灰色块中..试试