次のコードをblock.mouseEnabled = trueで1回実行し、再度block.mouseEnabled = falseでブロックごとに1回クリックします。AS3では、なぜマウスイベントが「ルート」をスキップして「ステージ」に行くのでしょうか?
var block:Sprite = new Sprite();
block.name = "block";
with(block.graphics){beginFill(0x000000,1);moveTo(0,0);lineTo(100,0);lineTo(100,100);lineTo(0,100);lineTo(0,0);endFill();}
block.mouseEnabled = true; //change to false to see how event target skips root
addChild(block)
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse_down, false, 0, true);
function mouse_down(e:MouseEvent):void{trace(e.target);}
なぜ「ルート」がターゲットとしてスキップされるのですか?これは設計によるものですか?この異常の設計理由は何か、あるいは何か?
普通のパターンからはっきりしているので、私はこれを聞いています。子オブジェクトがmouseEnabledをfalseに設定すると、その子エリアがクリックされたときに親がターゲットになります。
ルートは単にイベントキャプチャ/ターゲット/バブリングルートトゥルートリップの非参加エンドポイントであり、到達するものはルートではなくステージに適用されることがあります。
**モデレーター注** *純粋なノイズ、ゼロ信号に解消されたため、この問題のコメントは削除されました。コメントや議論の延長を避けてください。* –
本当に面白いです。マウスイベントをルートに手動でディスパッチすると、ステージにバブルが発生しますが、ルート上に描かれているシェイプやグラフィックスとマウスのやりとりがないと、ルートがターゲットになりません。代わりに常にデフォルトに設定されます。少なくとも、マウスのやりとりを妨げたり、ルートバックグラウンドではなくステージバックグラウンドとして機能したりすることなく、すべてのルートを描画することができます。 – Triynko
Martysの答えに関する私のコメントを参照してください。ルートオブジェクトは相対オブジェクトです。ステージの場合、stage.root == stage。つまり、循環参照です。オブジェクトターゲットは、すでにルート、つまりステージに設定されているため、「ルート」に設定されることはありません。 –