はい、修正が必要です。
イベントを無効にするのではなく、元のターゲットに到達する前にイベントを停止し、複製して遅延の後にクローンをリフレッシュすることができます。
イベントが表示リスト(どのように表示されているか)でどのように動作しているかわからない場合は、まずそれを説明してください。
ボタンをクリックすると、MouseEventが開始されます。このイベントは、「CLICK」イベントに登録されているすべてのイベントリスナーを、リスナーが登録されたときに設定された優先順位の順に呼び出すステージから開始されます。 listernersの優先度が同じであれば(デフォルトは0)、ランダムな順番で呼び出されます(登録されている順番通りです)。 ステージのすべてのリスナーが、祖先が呼び出されたボタンのリスト内の次のdisplayObjectと呼ばれると、同じことが再び発生します。 これは、マウスイベント(ボタン内のテキストフィールドラベルである可能性があります)を可能にするほとんどのdisplayオブジェクトの中まで、すべてを続けます。 ここで、キャプチャフェーズが終了し、ターゲットフェーズが開始されます。 最も内側のオブジェクトのすべてのリスナーがターゲットフェーズで呼び出されます。 その後、泡立つ段階が始まります。ここでは、前と同じ方法で親と祖父母のすべての池がステージまで呼び出されます(内側から)。
フラッシュでは、ターゲットフェーズがバブリングフェーズの一部として処理されることに注意してください。
これはどのように使用できますか?
よく登録すると、イベントリスナーでフェーズと優先度を指定します。デフォルトでは、バブリングフェーズと優先度0が設定されています。キャプチャフェーズのステージにclickイベントリスナーを優先int.MAX_VALUEで登録すると、別のリスナーの前にイベントが発生します。 次のコードは、他のリスナーによってクリックイベントが登録されないようにします。
stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE);
function stageClick(e:MouseEvent):void
{
e.stopImmediatePropagation();
}
これは、いくつかの他の問題を引き起こします。まず、すべてのことをしたくないということです。
- 一つの解決策は、 そのイベントが変更されている必要があり、すべてのボタンの リストを持っていること、およびe.targetでそれに対して をチェックすることになります。
- もう1つの解決策は、 遅延を必要とするボタンをすべて持つことです。 は、インターフェイスを実装します( IButtonDelayと呼ぶことができます)。そして、e.targetがIButtondelayの場合は、簡単なチェック をチェックします。
- 第三の溶液は、それはとにかく、この親に達する前にイベント を使用すること はほとんどありませんから、(メニューバーのような)containg 親のイベントをリッスンのみ になります。
最初の2つの解決策では、検出を簡略化するためにボタンの子のマウス操作を防止する必要があります(DisplayObjectContainer.mouseChildren = false)。 ここで選択したものが何であれ、次に簡単なタイマーで遅らせる必要があります。遅れてからイベントを再開してください。
e.target.dispatchEvent(e.clone());
これは、refiredイベントを遅延させないという問題を提起します。代わりに、単純なクローンの代わりにMouseEventから継承したイベントオブジェクトを起動することをお勧めします。 MouseEventは非常に簡単にコピーできますが、いくつかのプロパティしかありません。だから、それをキャプチャするときに、それが正常なマウスクリックか重複しているかどうかを確認することができます。あなたがイベントのより多くの種類(キーボードイベント)をリッスンする必要があるかもしれませんが、コードのほとんどを行うことができる
stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE);
function stageClick(e:MouseEvent):void
{
if(e.target is IDelayButton && !e is DelayedMouseEvent)
{
e.stopImmediatePropagation();
DelayEvent(e);
}
}
function DelayEvent(e:MouseEvent):void
{
//You code for the delaying, cloning and refiring the event here
}
:ボタンのinfaceの溶液を使用し
、それはようなものになるだろうそれらを含めるのに十分な汎用性。
長い読書を助け、ごめんなさい。
非常に良い答えです! –
あなたの歓迎、幸せなコーディング。 –