前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >额的神啊:AS3中Button被disable了,也会触发Click事件!

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

作者头像
菩提树下的杨过
发布2018-01-22 15:04:12
1.3K0
发布2018-01-22 15:04:12
举报
文章被收录于专栏:菩提树下的杨过
代码语言:javascript
复制
btnTest.addEventListener(MouseEvent.CLICK,btnTestClick);

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

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

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

代码语言:javascript
复制
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后,鼠标事件就不响应了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-05-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档