e.targetとe.currentTargetの違い


276

違いはわかりません。どちらも同じように見えますが、違いはあると思います。

どちらか一方をいつ使用するかの例をいただければ幸いです。


2
このフィドルは違いを非常にはっきりと示しています
Murhaf Sousli 2017年

1
そのイベントがDOMイベントと同じように動作することを確認するのに十分なほどActionScript3を知っている人はいますか?
Ben Creasy 2018年


Murhaf Sousliが提供するリファレンスは、違いとは何かという質問に答える明確な説明です。このフィドルを少し簡略化したバージョンが最良の答えです。
azakgaim

回答:


204

ベンの答えは完全に正しいです。ですから、彼の言うことを覚えておいてください。これからお伝えするのは完全な説明ではありませんが、マウスイベントと表示リストに関連してどのようe.targete.currentTarget動作するかを覚えておくのは非常に簡単です。

e.target=マウスの下にあるもの(ベンが言うように...イベントをトリガーするもの)。 e.currentTarget=ドットの前のもの...(下記参照)

したがって、「btns」というインスタンス名を持つクリップ内に10個のボタンがあり、次のようにしたとします。

btns.addEventListener(MouseEvent.MOUSE_OVER, onOver);
// btns = the thing before the dot of an addEventListener call
function onOver(e:MouseEvent):void{
  trace(e.target.name, e.currentTarget.name);
}

e.target10個のボタンの1つにe.currentTargetなり、常に「btns」クリップになります。

MouseEventをROLL_OVERに変更したり、プロパティbtns.mouseChildrenをfalseに設定しe.targetたりe.currentTargetすると、どちらも常に「btns」になることに注意してください。


2
つまり、言い換えると、targetは子であり、currentTargetはコンテナです。
Artemix

107
いいえ、currentTarget常にイベントをリッスンするオブジェクトです。targetイベントを受け取った実際のターゲットです。イベントごとのバブリングで、ターゲットはイベントを受け取り、表示リストをバブリングします。(またはイベントの取り込みのための他の方法ラウンド)
突く

4
イベントを送出したのが子だった場合、yesターゲットは子です。これはリスナーを割り当てたものなので、通常はe.currentTargetを使用します。ただし、上記のZevanのように、複数の子を持つコンテナで1つのリスナーが必要な状況では、e.targetを使用して、どの子がイベントをディスパッチしたかを確認します。
ベン・ゲイル

上記の@pokeからのコメントが最良の答えです。「currentTargetは常にオブジェクトのリスニングであり、targetはイベントを受信した実際のターゲットです」
PandaWood


28

e.currentTarget常に、イベントが実際にバインドされる要素です。e.targetイベントの発信元要素があるので、e.targetの子かもしれないe.currentTarget、あるいはe.target===可能性がありe.currentTarget、あなたのマークアップが構成されている方法に応じて、。


26

私は視覚的な答えが好きです。

ここに画像の説明を入力してください

をクリックすると#btn、2つのイベントハンドラーが呼び出され、画像に表示されているものを出力します。

ここのデモ:https : //jsfiddle.net/ujhe1key/


問題はJSではなくAS3についてです。
Artemix 2016年

1
タグ付けについて申し訳ありません。答えはまだ両方に適用されます。
マリアイネスパルニサリ2016年

8

たとえば、単一のリスナーを使用してさまざまなアクションをトリガーする場合などに、event.targetが役立つことに注意してください。中に10個のボタンがある典型的な「メニュー」スプライトがあるとしましょう。そうする代わりに:

menu.button1.addEventListener(MouseEvent.CLICK, doAction1);
menu.button2.addEventListener(MouseEvent.CLICK, doAction2);
etc...

あなたは単に行うことができます:

menu.addEventListener(MouseEvent.CLICK, doAction);

そして、event.targetに応じてdoAction(event)内で別のアクションをトリガーします(nameプロパティなどを使用します...)


5

例を挙げます:

var body = document.body,
    btn = document.getElementById( 'id' );
body.addEventListener( 'click', function( event ) {
    console.log( event.currentTarget === body );
    console.log( event.target === btn );
}, false );

「btn」をクリックすると「true」と「true」が表示されます!


3

e.currentTargetは常に、イベントリスナーが追加されるコンポーネントを返します。

一方、e.targetは、コンポーネント自体、またはイベントを受け取った直接の子、孫、孫などです。つまり、e.targetは、表示リスト階層の最上位にあり、子階層またはコンポーネント自体にある必要があるコンポーネントを返します。

Canvasに複数の画像があり、Canvas以外のコンポーネント内に画像をドラッグしたい場合などに使用できます。Canvasにリスナーを追加し、そのリスナーに次のコードを記述して、Canvasがドラッグされないようにすることができます。

function dragImageOnly(e:MouseEvent):void
{
    if(e.target==e.currentTarget)
    {
        return;
     }
     else
     {
        Image(e.target).startDrag();
     }
}


2
  • e.targetは、クリックした要素です
  • e.currentTargetは、イベントリスナーが追加された要素です。

ボタンの子要素をクリックする場合は、currentTargetを使用してボタンの属性を検出することをお勧めします。CHでは、e.targetを使用することが問題になる場合があります。


0

e.currentTargetは、イベントが登録されている要素(親)であり、e.targetは、イベントが指しているノード(子)です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.