2012-01-22 5 views
0

私のクラスの親にイベントを最初に処理させたいと思って、その子にイベントを処理させたいと思います。明示的にイベントをバブルアップする方法はありますか?私はこのようなことをしたい:私はAS3でイベントをバブリングするのに助けが必要です

... 
this.addEventListener(MouseEvent.CLICK, characterClicked); 
... 

private function characterClicked(e:Event):void{ 
// pass event to parent to be handled first 
... 
} 

これは可能ですか?

+0

オブジェクト1はオブジェクト2を追加します。オブジェクト2がクリックされます。 Object2は最初にイベントを取得します。 object2にobject1にイベントをバブリングしてから、そのイベントを処理させたいと思います。 – Boundless

答えて

0

私はこれを行う方法を考え出しました。ハックに見えますが、うまくいきます。これを行うより良い方法がある場合は、私に知らせてください。

... 
this.addEventListener(MouseEvent.CLICK, characterClicked); 
... 

private function characterClicked(e:Event):void{ 
// pass event to parent to be handled first 
this.removeEventListener(MouseEvent.CLICK, characterClicked); //prevent infinite loop 
      dispatchEvent(e); // send event to parent object 
      this.addEventListener(MouseEvent.CLICK, characterClicked); 
      e.stopImmediatePropagation(); 
... 
} 
+0

親のイベントをキャッチするためにイベントを明示的に再ディスパッチする必要はありません。 状況に応じて、親にイベントリスナーを追加し、親でイベントを処理し、親がイベント処理を終了したら、その子に対して関数を呼び出します。これは、各親に対してわずか1人の子供がいることを前提としています。 – ganaraj

+0

提案していただきありがとうございます。私は親クラスではなく、子クラスでこれを処理する必要があります。親コンテナコードは変更しないでください。 – Boundless

0

子の代わりに親のリスナーを処理する場合は、より簡単かもしれません。それで終わったらイベントを子どもに渡すことができます:

// inside parent class: 
childObj.addEventListener(MouseEvent.CLICK, onCharacterClicked); 

private function onCharacterClicked(e:Event):void { 
    // do parent stuff first 
    // ... 

    // then pass event to child 
    childObj.onCharacterClicked(e); 
} 
+0

ありがとうございますが、これは動作しません。私はクラスを書いており、親コンテナの内容を制御することはできません。これは、子オブジェクトで行う必要があります。 – Boundless

5

イベントの3つの「段階」があります。 Capture, At target and Bubble。この順番で発生します。つまり、イベントリスナーをキャプチャフェーズに設定すると、定期的に1セット前に起動します(これはターゲットまたはバブルのいずれかを意味します)。そのよう

// in parent, third argument is "use capture" 
child.addEventListener(MouseEvent.CLICK, handleClickInParent, true); 

// in child, add listener as usual 
addEventListener(MouseEvent.CLICK, handleClick); 

は今、あなたの親イベントリスナーは、常に最初に起動します!

+0

ありがとうございます、+1の解決策です。私はまだ子オブジェクト内からこれを行う方法を探しています。私はこのクラスを使うコードを書いているわけではありません(そのため、他のプログラマーがあなたの例のように3番目のパラメーターをtrueに設定することはできません)。あなたは子供の中からこれをする方法を知っていますか? – Boundless

+0

これを行う必要がある理由を説明するなら、私はおそらく何かを考え出すことができます。 – grapefrukt

+0

要するに、プログラムで使用されているグローバルブールフラグがあります。一部のオブジェクトをクリックすると、フラグがオンになり、クリックされると、フラグがオフになります(他のアクションと一緒に)。私のキャラクターがクリックされたとき、私はそのフラグが誰であるかに関係なくトグルされている必要があります。だから、私は私の親がそれが必要なことをしていることを確認する必要があります、そして、私はこのフラグをオンに切り替えて、キャラクターが必要とする他のことをすることができます。 – Boundless

関連する問題