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

简介: btnTest.addEventListener(MouseEvent.CLICK,btnTestClick); function btnTestClick(e:MouseEvent):void{ trace("我又被点了"); btnTest.enabled = false; } 啥也不说了,看代码,然后测试:按钮(注:指SimpleButton而非组件中的Button)被disable后,依然可以触发Click事件,AS3的发明者为啥要这样设计呢?反正我是没理解,不过既然它已经这样了,就只能顺着它走了。
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后,鼠标事件就不响应了。

目录
相关文章
|
前端开发 Java
|
机器学习/深度学习 人工智能 vr&ar
光流法相关论文-LK光流法,HS光流法,Farneback光流法,FlowNet: 端到端的深度光流估计, RAFT: 结构化的光流估计
光流法相关论文-LK光流法,HS光流法,Farneback光流法,FlowNet: 端到端的深度光流估计, RAFT: 结构化的光流估计
711 0
|
10月前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
136 6
|
C++
深度解析roc曲线、AUC与排序损失
深度解析roc曲线、AUC与排序损失
415 0
|
网络协议 SDN 数据安全/隐私保护
|
Web App开发 Android开发 iOS开发
阿里云无影APP客户端下载_无影云电脑下载
阿里云无影APP客户端下载_无影云电脑下载,阿里云无影云电脑APP下载链接入口,支持iOS、Android、Windows、macOS和Web客户端,阿里云百科分享阿里云无影云电脑APP下载链接
1900 0
|
机器学习/深度学习 人工智能 算法
【DouZero】 强化学习+self play达到人类玩家斗地主水平。
【DouZero】 强化学习+self play达到人类玩家斗地主水平。
715 0
|
网络协议 Ubuntu Linux
一键安装最新内核并开启 BBR 脚本
1、本脚本已在 [**蓝易云**](https://www.tsyvps.com/) 上的 VPS 全部测试通过。 2、当脚本检测到 VPS 的虚拟方式为 OpenVZ 时,会提示错误,并自动退出安装。 3、脚本运行完重启发现开不了机的,打开 VPS 后台控制面板的 VNC, 开机卡在 grub 引导, 手动选择内核即可。 4、由于是使用最新版系统内核,最好请勿在生产环境安装,以免产生不可预测之后果。
696 0
|
存储 Oracle NoSQL
阿里云服务器ESSD系统盘性能级别PL0、PL1、PL2和PL3详解
阿里云服务器ESSD云盘性能级别PL0、PL1、PL2和PL3,性能级别PL不同云盘容量、单盘最大IOPS、吞吐量及使用业务场景也不同,阿里云百科分享ESSD云盘性能级别PL详解
1347 0
阿里云服务器ESSD系统盘性能级别PL0、PL1、PL2和PL3详解
Windows cmd窗口改变字体或背景颜色
Windows cmd窗口改变字体或背景颜色
Windows cmd窗口改变字体或背景颜色