JavaScriptのcurrentTargetプロパティとtargetプロパティの正確な違いは何ですか


289

誰でも私にJavaScriptイベントのプロパティcurrentTargettargetプロパティの正確な違いと例、そしてどのシナリオでどのプロパティが使用されているか教えていただけますか?


その重要なespによって、一部のブラウザには異なるアプローチがあります。たとえば、divコピーイベントをリッスンすると、FFでは要素ではなくtextNodeを取得しますが、リスナーはdivレベルになります。
Nikos

回答:


401

基本的に、イベントはデフォルトでバブルするため、2つの違いは次のとおりです。

  • target イベントをトリガーした要素(ユーザーがクリックしたなど)です
  • currentTarget イベントリスナーが関連付けられている要素です。

このブログ投稿の簡単な説明をご覧ください。


111
target =イベントをトリガーした要素。currentTarget =イベントをリッスンする要素。
markmarijnissen 2014

2
@markmarijnissen上記の回答よりも有用で、投票数も多いため、コメントは必ず回答として入力してください。
Andrea


currentTargetを "specifiedTarget"と考える
craigmichaelmartin

それは必ずしも要素ではありません。例XMLHttpRequest
Knu

77

target =イベントをトリガーした要素。

currentTarget =イベントリスナーを持つ要素。


3
要素はイベントを発生させますが、イベントはリッスンしません。ハンドラーを割り当てて、それが発生したときに実行します。currentTargetは、イベントハンドラーがアタッチされたターゲットです。
Samyak Jain

23

最小限の実行可能な例

window.onload = function() {
  var resultElem = document.getElementById('result')
  document.getElementById('1').addEventListener(
    'click',
    function(event) {
      resultElem.innerHTML += ('<div>target: ' + event.target.id + '</div>')
      resultElem.innerHTML += ('<div>currentTarget: ' + event.currentTarget.id + '</div>')
    },
    false
  )
  document.getElementById('2').dispatchEvent(
          new Event('click', { bubbles:true }))
}
<div id="1">1 click me
  <div id="2">2 click me as well</div>
</div>
<div id="result">
  <div>result:</div>
</div>

クリックすると:

2 click me as well

次にそれを1リッスンし、結果に追加します:

target: 2
currentTarget: 1

その場合:

  • 2 イベントを発生させた要素です
  • 1 イベントをリッスンした要素です

クリックすると:

1 click me

代わりに、結果は次のとおりです。

target: 1
currentTarget: 1

Chromium 71でテスト済み。


18

これが動かない場合は、これを試してください:

現在現在currentTarget指します。それは、他の場所からバブルアップしたイベントをキャッチした最新のターゲットです。


5

<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>

<form onclick="alert('form')">FORM
  <div onclick="alert('div')">DIV
    <p onclick="alert('p')">P</p>
  </div>
</form>

上記のコードでPタグをクリックすると、3つのアラートが表示され、divタグをクリックすると、フォームタグをクリックすると2つのアラートと1つのアラートが表示されます。そして今、次のコードを見てください、

<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>
<script>
function fun(event){
  alert(event.target+" "+event.currentTarget);
}

</script>

<form>FORM
  <div onclick="fun(event)">DIV
    <p>P</p>
  </div>
</form>
Pとフォームのタグからonclickを削除しただけで、Pタグをクリックすると、アラートが1つだけ表示されます。

[オブジェクトHTMLParagraphElement] [オブジェクトHTMLDivElement]

ここで、event.targetは[object HTMLParagraphElement]であり、event.curentTargetは[object HTMLDivElement]です。

event.targetはイベントの発生元のノードであり、反対にevent.currentTargetは現在のイベントリスナーが接続されたノードを指します。詳細については、バブリングを参照してください

ここではPタグをクリックしましたが、Pにはリスナーがなく、その親要素divにあります。


2

event.targetは、イベントの発生元のノードです。イベントリスナーを配置する場所(段落またはスパン)に関係なく、event.targetはノード(ユーザーがクリックした場所)を参照します。

反対に、event.currentTargetは、現在のイベントリスナーがアタッチされたノードを参照します。すなわち。イベントリスナーを段落ノードにアタッチした場合、event.currentTargetは段落を参照し、event.targetはまだスパンを参照します。注:bodyにもイベントリスナーがある場合、このイベントリスナーの場合、event.currentTargetはbodyを参照します(つまり、event-listernersへの入力として提供されるイベントは、イベントが1つのノードをバブルするたびに更新されます)。


このページを訪れる人にとって、この答えは正しくありません!! 受け入れられた答えを確認してください!このことは忘却に反対されるべきです。delegateTargetは、イベントがアタッチされた場所を参照するノードです。
LittleTreeX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.