JavaScript'teki window.location ve document.location arasındaki fark nedir?


Yanıtlar:


220

W3C'ye göre, bunlar aynı. Gerçekte, tarayıcılar arası güvenlik için kullanmak window.locationyerine kullanmalısınız document.location.

Bkz. Http://www.w3.org/TR/html/browsers.html#dom-location


12
Downvoted. Çelişkili cevap verin. Cesurca aynı olduklarını söyler, daha açık metindeki farklılıkları açıklar. Kesinlikle aynı değiller.
danorton

33
Tetikleyici-mutlu aşağı seçmenler, biraz aydınla. Çoğunlukla, rahul tarafından BELİRTİLEN MAĞARAYI DEĞERLENDİRİR. Onu anlambilim üzerine çivilemeyelim. Biraz philadelphia, beyler. Birincisi, cevabını tamamen tatmin edici buldum. +1 (Christoph's kabul edilen cevap olmalı, ancak rahul's kabul edilebilir - en azından aşağı oy kullanmaya layık değil.)
cssyphus

7
window.locationHerhangi bir gerekçe sunmadan en iyi uygulamayı (her zaman kullanarak ) tavsiye etmek için -1 . Gerekçeyi sağlamazsan neden birileri tavsiyeni alsın? Christoph'un cevabı bu konuda çok daha faydalı.
Mark Amery

+1 ama aynı zamanda Phil Hamer ve Christoph tarafından verilen cevaplara da bakın, sorunu tam olarak anlamak için temel arka plan bilgileri ve uyarılar ekliyorlar.
Jon z

Aslında, ikisi arasında bir fark görüyorum, Örneğin, bir alt çerçeveden korumalı alan çerçevesine gezinmek istiyorsanız, bunu sadece document.location ile yapabilirsiniz, ancak window.location ile
yapamazsınız

207

Geçerli konum nesnesini almanın standart yolu window.location( 1996'dan itibaren bu MSDN sayfasına ve 2006'dan itibaren W3C taslağına bakınız ).

Bunu document.location, başlangıçta yalnızca geçerli URL'yi bir dize olarak döndüren ile karşılaştırın (MSDN'deki bu sayfaya bakın ). Muhtemelen karışıklığı önlemek için , aynı zamanda DOM Seviye 1'in bir parçası olan ( buraya MSDN'de bakınız ) document.locationile değiştirildidocument.URL .

Gibi bildiğim kadarıyla, tüm modern tarayıcılar harita document.locationiçin window.location, ama yine de tercih window.locationo benim ilk DHTML yazdım beri kullandım ne kadar.


1
kullanırsanız window.location, sadece kullanmak eşit derecede geçerli değil locationmi?
commonpike

2
@commonpike - En azından bir HTML belgesindeki bir betik bağlamında, tanımlanan tüm değişkenlerin özellik haline geldiği global nesne, windownesnedir. Bu nedenle, komut dosyanızın en üst düzeyinde tanımladığınız herhangi bir değişken veya işlev, başvuruda bulunulan windownesnenin, genel nesne olan bir özelliğidir. Küresel nesne, yokken ima edilir window.- dolayısıyla bu locationşekilde yorumlanır window.location. Uyarılar - fe if(an_undefined_variable)değişken tanımlanmadıysa bir hata atar - if(window.an_undefined_variable)yapmaz.
amn

92

window.location tüm uyumlu tarayıcılarda okunur / yazılır.

document.location , Internet Explorer'da salt okunurdur (en azından), ancak Gecko tabanlı tarayıcılarda (Firefox, SeaMonkey) okuma / yazma işlemidir.


10
document.locationIE'de salt okunur olan talebi yeniden oluşturamıyorum . IE 10, 9, 8 ve 6'da başarılı bir şekilde atayabilirim ( modern.ie'den VM'ler kullanarak ).
Mark Amery

herhangi bir yorum console.log(location);? !!
Fr0zenFyr

44

document.locationGecko tarayıcıları da atamanıza izin vermesine rağmen, aslında salt okunur bir özellikti . Tarayıcılar arası güvenlik için şunu kullanın:window.location kullanın.

Daha fazla oku:

document.location

window.location


Bunlardan herhangi birini ne zaman kullanacağım konusunda net bir cevap bulamıyorum, aşağıdaki cevabımıza bir göz atın
M.Abulsoud

37

İlginç bir şekilde, 'konum' adında bir çerçeve, resim veya formunuz varsa, 'document.location', Location nesnesi yerine sırasıyla çerçeve penceresine, resme veya forma başvuru sağlar. Görünüşe göre, bunun nedeni document.forms, document.images ve window.frames koleksiyon adı aramasının window.location eşlemesine göre önceliğe sahip olmasıdır.

<img name='location' src='location.png'>

if (document.location.tagName == 'IMG') alert('Hello!')

2
Öncelik yok, sadece üzerine
yazılıyor

7
Hayır, üzerine yazılmaz. Gölgeli, bu yüzden Phil mülkiyet çözümü sırasında öncelikli eleman konusunda haklı.
kanguru

@kangax, Haklısın gibi görünüyor: jsfiddle.net/uL4ysszr . Ancak bu davranış ne kadar güvenilir? Çapraz tarayıcı yeterli mi?
Pacerier

1
Bunu yeni test ettim (Ekim 2016). Görünüşe göre window.locationve document.locationChrome veya Firefox'ta gölgelenemez.
Bay Llama

1
@ Mr.Llama Haklısın. Görünüşe göre tüm modern tarayıcılar yukarıda açıkladığım şekilde davranmıyor. Bu, document.location işlevine "Unforlable" özelliği verilmesi nedeniyle görünüyor. İlgili Chromium değişikliği: src.chromium.org/viewvc/blink?view=revision&revision=189862 Ve Firefox hatası: bugzilla.mozilla.org/show_bug.cgi?id=1133760
Phil Hamer

27

Bildiğim kadarıyla, ikisi de aynı. Çapraz tarayıcı güvenliği için kullanmak window.locationyerine kullanabilirsiniz document.location.

Tüm modern tarayıcılar harita document.locationiçin window.location, ama yine de tercih window.locationo benim ilk web sayfasını yazdı beri kullandım ne kadar. daha tutarlıdır.

her ikisinin de aynı olduğunu açıklayan document.location === window.locationgetirileri de görebilirsiniz true.


14

document.location === window.location İadeler true

Ayrıca

document.location.constructor === window.location.constructor dır-dir true

Not: Sadece test edildi, Firefox 3.6, Opera 10 ve IE6


1
@Pacerier Neden? Nesneler için ===ve ==eşdeğerdir.
Mark Amery

4
@MarkAmery, Bu yanlış ve kolayca ispat edilebilir: "abc" == new String("abc")döner trueiken "abc" === new String("abc")döner false.
Pacerier

7
@Pacerier Tamam, bunu biraz daha titiz ve daha az belirsiz bir şekilde ifade edeyim: iki nesneyi birbirleriyle karşılaştırırken (sadece bir şey yerine bir nesne yerine) ==ve ===eşdeğerdir. Bkz Spec bölümleri 11.9.3 ve 11.9.6. Olmayan boş için, sigara tanımsız olmayan sayı olmayan bool, aynı tip olmayan dize değerleri, ==davranış 11.9.3 kısım 1f ve tabidir ===aynı okunan 11.9.6 parçası 7 ile davranış Return trueeğer x ve y aynı nesneyi belirtir. Aksi takdirde geri dönün false.
Mark Amery

10
@MarkAmery Orada hem dair bir garanti olduğunu document.locationve window.locationnesnelere işaret ediyor. Üçlü eşitliğin tüm noktasını kaçırıyorsunuz; 2 eşittir kullanmak , aynı hedef olduklarını kanıtlamaz . 2 eşit değil 3 eşit olmalı, çünkü 2 eşittir bize yanlış pozitif verecektir. Document.location öğesinin eşit olduğu bir URL dizesi olduğu bir tarayıcıda window.location.toString(), Sonra document.location==window.locationtrue document.location===window.locationdeğerini döndürürken false döndürür.
Pacerier

@ Pacer Aha - Sonunda anladım. En azından document.location === window.locationkarşılaştırma kadar oldukça haklısın. Aslında .constructorkarşılaştırma da araçlarında atılır, bu cevabı hala sağlam olduğunu, düşünüyorum, ama kullanarak ===muhakeme basitleştirmek olur.
Mark Amery

11

Evet, onlar aynı. Tarayıcı JS API'sındaki birçok tarihi tuhaflıktan biridir. Yapmayı dene:

window.location === document.location

8

window.location, eski tarayıcılar göz önüne alındığında, ikisi arasında daha güvenilir bir şekilde tutar.


3

Günümüzde farkı görmek nadirdir çünkü html 5 artık çerçeve kümelerini desteklemez. Ancak çerçeve kümemiz olduğunda, document.location yalnızca kodun yürütülmekte olduğu kareyi yeniden yönlendirir ve window.location tüm sayfayı yeniden yönlendirir.


2

window.locationMevcut URL'yi almanın daha güvenilir yolu olduğunu söyleyebilirim . URL'de karma parametreleri ekleyip daha sonra okuduğum senaryolardan birinde öne çıkan window.locationve arasındaki fark document.urlaşağıdadır.

URL'ye karma parametreleri ekledikten sonra.

Eski bir tarayıcıda, hash parametrelerini kullanarak URL'den alamadım document.url, ancak kullandığımda window.locationhash parametrelerini URL'den alabildim.

Bu yüzden kullanmak her zaman daha iyidir window.location.


1
-1. Soru bile bahsetmedi document.URL- hakkında window.locationve oldu document.location. Ayrıca, document.urlyok = büyük harf olmalıdır.
Mark Amery

2

document.location.constructor === window.location.constructor dır-dir true .

Çünkü tam olarak görebileceğiniz nesne document.location===window.location .

Dolayısıyla, yapıcıyı veya başka bir mülkü karşılaştırmaya gerek yoktur.


2

En azından IE'de, yerel dosyada küçük bir fark var:

document.URL "dosya: // C: \ projects \ abc \ a.html" döndürecektir

ancak window.location.href "file: /// C: /projects/abc/a.html" döndürür

Biri eğik çizgi, diğeri eğik çizgi.


2

Evet, onlar aynı, ama ....!

window.location bazı Internet Explorer tarayıcılarında çalışmıyor.


0

Çoğu insanın burada önermesine rağmen, Google Analytics'in dinamik protokolü snipleri asırlardır (son zamanlarda ga.js'den analytics.js'ye geçmeden önce) şöyle görünüyordu:

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

Daha fazla bilgi: https://developers.google.com/analytics/devguides/collection/gajs/

Yeni sürümde '//' kullandılar, böylece tarayıcı otomatik olarak protokol ekleyebilir:

'//www.google-analytics.com/analytics.js'

Yani eğer Google tercih document.location için window.locationonlar JS protokolü gerektiğinde, ben bunun için bazı nedenleri var sanırım.

GENEL : Ben şahsen inanıyorum document.locationve window.locationaynı fakat gibi tarayıcıların kullanımı hakkında büyük istatistiklerle dev eğer Google kullanarak document.location , onları takip etmek önerilir.


2
Ancak, bu gerçekten eski bir soru olduğu ve cevabınızın birinin diğerinden daha iyi olduğuna dair yeni veya değerli bir kanıt sunmadığı için aşağıya inmedim. Ya da bunun nedeni, yanıtınızın Google'ın tarihsel olarak yaptıklarına verdiğiniz liyakatten bağımsız olarak kamuoyunun tersini önermesi olabilir. Ya da downvoter, cevabınızın gerçekten vurgulanması gerekmeyen kısımlarına nasıl vurgu yaptığınızı beğenmemiş olabilir. Gerçekten bir şey olabilir. SO'ya anonim oylamanın güzelliği budur.
M.Babcock

0

Aslında, ikisi arasında krom farkı fark ediyorum. Örneğin, alt çerçeveden korumalı alan çerçevesine gezinme yapmak istiyorsanız, bunu sadece document.location ile yapabilirsiniz, ancak window.location ile yapabilirsiniz.

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.