zoukankan      html  css  js  c++  java
  • 额的神啊: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后,鼠标事件就不响应了。

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Vue项目入门实例
    批量生成删除表数据的SQL语句
    收集的一个可多选日期的日期插件,带日历、农历
    .net core EF,多个dbcontext时,迁移数据方法
    【NET】雪花算法
    URL地址中使用中文作为的参数【转】
    C# 继承 base
    SQL Like
    SecureCRT 8.5 配置自动记录日志
    CentOS 7下Samba服务器的安装与配置
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1745604.html
Copyright © 2011-2022 走看看