额的神啊:AS3中Button被disable了,也会触发Click事件!

btnTest.addEventListener(MouseEvent.CLICK,btnTestClick);

function btnTestClick(e:MouseEvent):void{
	trace("我又被点了");
	btnTest.enabled = false;
}

啥也不说了,看代码,然后测试:按钮(注:指SimpleButton而非组件中的Button)被disable后,依然可以触发Click事件,AS3的发明者为啥要这样设计呢?反正我是没理解,不过既然它已经这样了,就只能顺着它走了。

 

要想按钮事件仅被触发一次,正确的做法只能是removeEventListener

btnTest.addEventListener(MouseEvent.CLICK,btnTestClick);

function btnTestClick(e:MouseEvent):void{
	trace("我又被点了");
	btnTest.enabled = false;
	btnTest.removeEventListener(MouseEvent.CLICK,btnTestClick);
}

后记

事后仔细想了想Adobe为什么要这样设计?我想这或许就是Adobe与Microsoft的编程哲学观不同,在Adobe看来,事件监听就应该只负责事件监听,其它任何跟我无关的事情都不能影响我,即单一职责;而在Microsoft看来,各种设计之间应该相互协助,按钮在被disabled时,应该主动停止事件响应,而在enabled时恢复事件响应。

其实这种观念上的区别,在flash与sliverlight中有很多体现,比如在Flash中,一个Sprite只要你注册了Enter_Frame事件,不管该Sprite的实例有没有添加到显示列表,只要被new出来以后,Enter_Frame事件处理函数就会一直不停的跑,直接手动调用removeEventListener干掉事件监听;而在Sliverlight中,一个自定义的用户控件new出来以后,只要不被添加到(根)显示容器中,其对应的CompositionTarget.Rendering事件不会被触发的。

此外,仔细查看官方文档后,发现如果不用removeEventListener来处理,要想禁止鼠标事件响应,还有另一个属性mouseEnabled,把它跟enabled同时设置为false后,鼠标事件就不响应了。

posted @ 2010-05-27 17:18  菩提树下的杨过  阅读(3865)  评论(5编辑  收藏  举报