document.addEventListenerとwindow.addEventListenerの違いは何ですか?


135

PhoneGapのを使用している間、それが使用しているいくつかのデフォルトのJavaScriptコードを持っているdocument.addEventListenerが、私はその用途に私自身のコードを持っていますwindow.addEventListener

function onBodyLoad(){
    document.addEventListener("deviceready", onDeviceReady, false);
    document.addEventListener("touchmove", preventBehavior, false);
    window.addEventListener('shake', shakeEventDidOccur, false);
}

違いは何ですか?どちらを使用するのが良いですか?

回答:


160

異なるオブジェクトであり、彼らはいくつかの異なるイベントがあります。それらを使用すると、別のオブジェクトを宛先とするイベントをリッスンします。興味のあるイベントが実際にあるものを使用する必要があります。documentwindowaddEventListener()

たとえば"resize"windowオブジェクト上にないオブジェクトのイベントがありdocumentます。

たとえば、"DOMContentLoaded"イベントはdocumentオブジェクト上でのみ発生します。

したがって、基本的には、関心のあるイベントを受信し、.addEventListener()その特定のオブジェクトで使用するオブジェクトを知る必要があります。

次の興味深いグラフは、どのタイプのオブジェクトがどのタイプのイベントを作成するかを示しています。https//developer.mozilla.org/en-US/docs/DOM/DOM_event_reference


伝播されたイベント(クリックイベントなど)をリッスンしている場合は、ドキュメントオブジェクトまたはウィンドウオブジェクトのいずれかでそのイベントをリッスンできます。伝播されるイベントの唯一の主な違いはタイミングです。イベントは階層の最初に発生するため、documentオブジェクトの前にwindowオブジェクトにヒットしますが、その違いは通常重要ではないため、どちらを選択してもかまいません。伝搬されたイベントを処理するときに、ニーズを満たすイベントのソースに最も近いオブジェクトを選択する方が一般的には良いと思います。それはあなたが選ぶことを示唆しているdocument以上のwindowいずれかが動作するとき。しかし、私はしばしばソースにさらに近づいて使用しますdocument.body、ドキュメント内の共通の親を使用します(可能な場合)。


私は「ウィンドウまでではなく、ドキュメントまでバブリングする」ことに興味がありました。だから私はここでそれをテストしました-> jsfiddle.net/k3qv9/1私は何かが足りないのですか、それとも泡が実際に発生していますか?
banzomaikaka 2012

1
@JOPLOmacedo-あなたのコメントの前に、どのイベントがウィンドウにバブリングするかわからないのかわからないので、バブリングに関する部分を私と同じように削除しました。私が常に見たプロトコルは、document.bodyオブジェクトまたはオブジェクトでドキュメント全体のバブリングイベントをインターセプトdocumentするwindowため、バブリングされたイベントに使用する理由はありません。いずれにせよ、私の答えの要点は、一部のイベントのみがオンでwindow、一部のイベントがオンでdocumentあり、一部が両方であるので、OPは、処理するイベントに対応するオブジェクトを選択する必要があります。
jfriend00

オッケー。それも私が普段やっていることです。まさにそれをテストすることにしたのです。答えてくれてありがとう!
banzomaikaka 2012

「クリック」イベントはドキュメントとウィンドウの両方で使用できるため、ドキュメントとウィンドウの両方でイベントを登録すると、ドキュメントのクリックハンドラーが最初に起動してからウィンドウが起動します。したがって、この観点では、ドキュメントの選択がより適切です。 jsfiddle.net/3LcVw
コーダー

1
別の例:Samsung TVにaddEventListener("keydown", event)via windowを追加すると、機能しなくなります。しかし、あなたはで同じことをしますdocument、そしてそれはそうします。特定のデバイスがバブルイベントを呼び出す方法にも依存します。
Jakub Kubista

4

JavaScriptでは、通常、同じことを実行したり同じ情報を検索したりするには、さまざまな方法があります。あなたの例では、常に存在することが保証されている要素を探しています。windowそしてdocumentの両方が(ちょうどいくつかの違いで)ぴったり合います。

mozilla dev networkから:

addEventListener()は、単一のターゲットに単一のイベントリスナーを登録します。イベントターゲットは、ドキュメント内の単一の要素、ドキュメント自体、ウィンドウ、またはXMLHttpRequestです。

常にそこにいる「ターゲット」を信頼できる限り、唯一の違いは、どのイベントをリッスンするかということです。お気に入りを使用してください。


5
これは一般的には当てはまりません。さまざまなオブジェクトでさまざまなイベントが発生します。 documentそして、window同じイベントを受信しません。あなたは。興味のあるイベントを取得するオブジェクトを選択する必要がありますいくつかのイベントは、両方に行くことdocumentwindow、すべてではありません。
jfriend00

1

window結合は、組み込みブラウザによって提供されるオブジェクトを指します。を含むブラウザウィンドウを表しますdocument。そのaddEventListenerメソッドを呼び出すと、最初の引数で記述されたイベントが発生するたびに呼び出される2番目の引数(コールバック関数)が登録されます。

<p>Some paragraph.</p>
<script>
  window.addEventListener("click", () => {
    console.log("Test");
  });
</script>

addEventListnersにウィンドウまたはドキュメントを選択する前に、次の点に注意する必要があります

  1. イベントのほとんどは、のために同じですwindowdocumentが、いくつかのイベントが好きresize、とに関連する他のイベントloadingunloadingおよびopening/closingすべてのウィンドウ上で設定する必要があります。
  2. windowはドキュメントを持っているので、イベントが最初にドキュメントにヒットするので、(処理できる場合は)documentを使用して処理することをお勧めします。
  3. Internet Explorerは、ウィンドウに登録されている多くのイベントに応答しないため、イベントを登録するにはドキュメントを使用する必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.