额の神:AS 3の中でButtonはdisableされて、同じくClick事件を触発することができます!

1438 ワード

btnTest.addEventListener(MouseEvent.CLICK,btnTestClick);

function btnTestClick(e:MouseEvent):void{
	trace(" ");
	btnTest.enabled = false;
}

何も言わないで、コードを見て、それからテストします:ボタン(注:コンポーネントの中のButtonではなくSimpleButtonを指します)がdisableされた後に、依然としてClick事件をトリガーすることができて、AS 3の発明者はどうしてこのように設計しますか?どうせ私は理解していませんが、それがすでにこのようになった以上、それに沿って行くしかありません.
 
ボタンイベントを一度だけトリガーするには、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の中で、1つのSpriteはあなたがEnterを登録した限りFrameイベントは、このSpriteのインスタンスが表示リストに追加されているかどうかにかかわらず、newが出てきたらEnter_Frameイベント処理関数はずっと走っていて、直接手動でremoveEventListenerを呼び出してイベントの傍受をします.一方、Sliverlightでは、カスタムのユーザコントロールnewが出てくる後、(ルート)表示容器に追加されない限り、対応するComponentTarget.Renderingイベントはトリガーされません.
また、公式ドキュメントをよく見ると、removeEventListenerで処理しなくてもマウスイベント応答を禁止するには、もう一つのプロパティmouseEnabledがあり、enabledと同時にfalseに設定すると、マウスイベントは応答しません.