Document.addEventListener ve window.addEventListener arasındaki fark nedir?


135

PhoneGap kullanırken document.addEventListener, kullanan bazı varsayılan JavaScript kodu vardır , ancak şunu kullanan kendi kodum var window.addEventListener:

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

Fark nedir ve hangisi daha iyidir?

Yanıtlar:


160

documentVe windowfarklı nesnelerdir ve bunlar bazı farklı etkinlik. addEventListener()Onları kullanmak farklı bir nesne için hedeflenen olayları dinler. İlgilendiğiniz etkinliğe gerçekten sahip olanı kullanmalısınız.

Örneğin "resize", windownesne üzerinde, nesne üzerinde olmayan bir olay vardır document.

Örneğin, "DOMContentLoaded"olay yalnızca documentnesnenin üzerindedir.

Temel olarak, ilgilendiğiniz olayı hangi nesnenin aldığını bilmeniz ve .addEventListener()o nesne üzerinde kullanmanız gerekir .

Hangi nesne türlerinin hangi olay türlerini oluşturduğunu gösteren ilginç bir grafik: https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference


Yayılan bir etkinliği (click olayı gibi) dinliyorsanız, o olayı belge nesnesinde veya pencere nesnesinde dinleyebilirsiniz. Yayılan olaylar için tek temel fark zamanlamadır. Olay , hiyerarşide ilk gerçekleştiği için documentnesneden önce windownesneye çarpar, ancak bu fark genellikle önemsizdir, böylece ikisini de seçebilirsiniz. Çoğaltılmış olayları işlerken ihtiyaçlarınızı karşılayan olayın kaynağına en yakın nesneyi seçmek genellikle daha iyi olur. Yani almak öneririm documentüzerinde windowde işe ne zaman. Ancak, genellikle kaynağa daha da yaklaşırım ve document.bodyhatta belgedeki ortak bir ebeveyni (mümkünse) kullanırdım.


Ben "belgeye kadar köpüren ama pencere değil" şey merak ediyordum. Bu yüzden burada test ettim -> jsfiddle.net/k3qv9/1 Bir şey mi eksik veya köpürme gerçekten oluyor mu?
banzomaikaka

1
@JOPLOmacedo - Yorumunuzdan önce, köpürme ile ilgili kısmı kaldırdım, çünkü ben hangi olayların pencereye kabarcıklandığını ve hangilerinin kabarcıklanmadığından emin değilim. Her zaman gördüğüm protokol, document.bodynesnede veya nesnede geniş fokurdayan olayları durdurmaktır , documentböylece windowkabarmış olaylar için kullanmak için bir neden yoktur . Her durumda cevabımın amacı, bazı olayların sadece açık windowve bazı olayların sadece açık documentve bazılarının her ikisinde de olması, OP'nin işlemek istedikleri olaya karşılık gelen nesneyi seçmesidir.
jfriend00

Tamam dokey. Ben de genellikle bunu yapıyorum - tam olarak neden test etmeye karar verdim. Cevap için teşekkürler!
banzomaikaka

'Click' olayı hem belgede hem de pencerede mevcut olduğundan ve olayı hem belgeye hem de pencereye kaydedersek, önce belge ateşinin tıklama işleyicisini ve ardından penceresini tıklatın. dolayısıyla bu bakış açısından belge seçimi daha iyidir. jsfiddle.net/3LcVw
kodlayıcı

1
Başka bir örnek: Eğer katacak olursa addEventListener("keydown", event)aracılığıyla windowişe yaramaz daha Samsung TV için. Ama sen de aynı şeyi yapacaksın document, o zaman yapacak. Ayrıca, kabarcıklı olayları nasıl çağırdığı belirli bir cihaza da bağlıdır.
Jakub Kubista

4

Javascript'te genellikle aynı şeyi yapmanın veya aynı bilgileri bulmanın birçok farklı yolu olduğunu göreceksiniz. Örneğinizde, her zaman var olması garanti edilen bazı öğeler arıyorsunuz. windowve documenther ikisi de faturaya uyar (sadece birkaç farkla).

Gönderen mozilla dev ağına :

addEventListener () tek bir olay dinleyicisini tek bir hedefe kaydeder. Olay hedefi bir belgedeki tek bir öğe, belgenin kendisi, bir pencere veya bir XMLHttpRequest olabilir.

"Hedef" in her zaman orada olmanıza güvenebildiğiniz sürece, tek fark hangi olayları dinlediğinizdir, bu yüzden sadece favorinizi kullanın.


5
Bu genel olarak doğru değil. Farklı nesnelerde farklı olaylar meydana gelir. documentve windowaynı olayları almayın. Sen. Eğer ilgilenen edilir olayı alır nesneyi seçmelisiniz bazı olaylar hem gidebilir documentve window, ama hepsi değil.
jfriend00

1

windowBağlama yerleşik bir nesne tarayıcısı tarafından sağlanan karşılık gelir. document. İçeren tarayıcı penceresini temsil eder . addEventListenerYöntemini çağırmak, ilk argümanında açıklanan olay meydana geldiğinde çağrılacak ikinci argümanı (geri arama fonksiyonu) kaydeder.

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

Eklenecek pencere veya belgeyi seçmeden önce aşağıdaki noktalara dikkat edilmelidir

  1. Olayların çoğu için aynıdır windowveya documentancak bazı olaylar gibi resize, ve diğer etkinlikler ile ilgili loading, unloadingve opening/closingtüm pencere ayarlanmalıdır.
  2. Pencerenin belgeye sahip olması nedeniyle, olay önce belgeyi vuracağından işlemek için belge kullanmak iyi bir uygulamadır (işleyebilirse).
  3. Internet Explorer, pencerede kayıtlı olan pek çok olaya yanıt vermediğinden, etkinliği kaydetmek için belge kullanmanız gerekir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.