0

AS3 に関する多くの記事を読み、実際に実際のプロジェクトを完了したにもかかわらず、単純なイベント処理タスクに戸惑うことがよくあります。

現在の Flex プロジェクトでは、ユーザーはカスタム BorderContainer ベースのクラスのインスタンスを作成し、それらを選択して移動またはサイズ変更できます。現在選択されているインスタンスを選択解除するために、背景の BorderContainer (またはステージ) で発生するマウス クリックを検出するイベント リスナーを追加したいと考えています。

誰かがこれを達成するための手順を概説できますか? 考えられることはすべて試しました (有効化/無効化useCapture、event.target と event.currentTarget の比較、eventPhase のテスト)。

私のプロジェクトは複雑すぎて投稿できませんが、以下の単純なテスト ケースを使用すると、次のような出力が得られますが、まったく意味がありません。結果は同じです。

私の質問: 特定のオブジェクトでのみ発生するマウス イベントを検出するにはどうすればよいですか?

カスタム BorderContainer のインスタンスをクリックします。

----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3

background直接クリックする:

----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3

//----------------------

background.addEventListener(MouseEvent.CLICK, backgroundClick); 
background.addEventListener(MouseEvent.CLICK, backgroundClick, true); 
stage.addEventListener(MouseEvent.CLICK, stageClick); 
stage.addEventListener(MouseEvent.CLICK, stageClick, true);

protected function backgroundClick(event:MouseEvent):void {
    trace("-----------background click", event.eventPhase);  

    if (event.target == background){
        trace("background is TARGET",event.eventPhase);
    }

    if (event.currentTarget == background){
        trace("background is currentTarget",event.eventPhase);
    }
} 

protected function stageClick(event:MouseEvent):void {
    trace("----------stage click",event.eventPhase); 
    if (event.target == stage){
        trace("stage is currentTarget",event.eventPhase);
    }

    if (event.currentTarget == stage){
        trace("stage is TARGET",event.eventPhase);
    }
}
4

1 に答える 1

0

イベント バブルをクリックします。つまり、伝播を停止しない限り。イベントがディスパッチされたポイントからステージまでの階層内のすべてのコンポーネントは、バブル フェーズ中にクリック イベントを受け取ります。ステージにイベント リスナーを追加すると、アプリ内のすべてのクリック イベントが取得されます。ステージは階層の最上位レベルであるためです。

通常、BorderContainer の特定のインスタンスにイベント リスナーを追加します。ステージ上ではありません。

docsでイベントがどのように機能するかについての詳細情報。

于 2012-10-13T22:15:40.397 に答える