В чем разница между window.location и document.location в JavaScript?

Ответы:

220

По словам W3C, они одинаковы. На самом деле, для кросс-браузерной безопасности, вы должны использовать, window.locationа не document.location.

Смотрите: http://www.w3.org/TR/html/browsers.html#dom-location

Рахул
источник
12
Downvoted. Ответ противоречивый. Он смело говорит, что они одинаковы, затем описывает различия в более легком тексте. Они решительно не одинаковы.
Данортон
33
Да ладно, спешите, счастливые избиратели, немного облегчитесь. По большей части они ведут себя аналогичным образом, учитывая Пещеру, указанную Рахулом. Давайте не будем прибивать его к семантике. Немного Филадельфии, господа. Я, например, нашел его ответ полностью удовлетворяющим. +1 (Кристоф должен быть принятым ответом, но рахул приемлемый - по крайней мере, не заслуживающий
отрицательного
7
-1 за рекомендацию передовой практики (всегда использую window.location) без объяснения причин. Если вы не предоставите обоснование, почему кто-то должен принять ваш совет? Ответ Кристофа гораздо более полезен в этом отношении.
Марк Эми
+1, но также смотрите ответы Фила Хамера и Кристофа ниже, они добавляют важную справочную информацию и предостережения, чтобы полностью понять проблему.
Джон
На самом деле я замечаю разницу между ними. Например, если вы хотите выполнить навигацию к изолированному фрейму из дочернего фрейма, вы можете сделать это только с document.location, но не с window.location
M.Abulsoud
207

Канонический способ получить объект текущего местоположения window.location(см. Эту страницу MSDN от 1996 года и черновик W3C от 2006 года). ).

Сравните это с тем document.location, что первоначально вернул текущий URL только в виде строки (см. Эту страницу в MSDN ). Вероятно, чтобы избежать путаницы, document.locationбыл заменен на document.URL(см. Здесь, на MSDN ), который также является частью DOM Level 1 .

Насколько я знаю, все современные браузеры document.locationсоответствуют window.location, но я все еще предпочитаю, так window.locationкак это то, что я использовал, так как я написал свой первый DHTML.

Christoph
источник
1
если вы используете window.location, разве это не одинаково справедливо, чтобы просто использовать location?
Commonpike
2
@commonpike Это - в контексте скрипта в [по крайней мере] документе HTML, глобальный объект, где все определенные переменные становятся свойствами, является windowобъектом. Таким образом, любая переменная или функция, которую вы определяете на верхнем уровне вашего скрипта, является свойством объекта window, на который ссылается , который является глобальным объектом. Глобальный объект подразумевается, когда отсутствует как window.- таким образом locationинтерпретируется как window.location. Предостережения - fe if(an_undefined_variable)выдаст ошибку, если переменная не была определена - if(window.an_undefined_variable)не будет.
amn
92

window.location доступен для чтения / записи во всех совместимых браузерах.

document.location доступен только для чтения в Internet Explorer (по крайней мере), но доступен для чтения / записи в браузерах на основе Gecko (Firefox, SeaMonkey).

Фредерик Хамиди
источник
10
Я не могу воспроизвести утверждение, которое доступно document.locationтолько для чтения в IE. Я могу успешно назначить его в IE 10, 9, 8 и 6 (используя виртуальные машины из modern.ie ).
Марк Эми
какие-либо комментарии console.log(location);? !!
Fr0zenFyr
44

document.locationПервоначально это было свойство только для чтения, хотя браузеры Gecko также позволяют назначать его. Для кросс-браузерной безопасности используйтеwindow.location вместо этого.

Читать далее:

document.location

window.location

diEcho
источник
Я не могу найти четкого ответа, когда использовать любой из них, взгляните на мой ответ ниже
М.Абулсуд,
37

Интересно, что если у вас есть фрейм, изображение или форма с именем «location», то «document.location» предоставляет ссылку на окно фрейма, изображение или форму соответственно вместо объекта Location. По-видимому, это связано с тем, что поиск имени коллекции document.forms, document.images и window.frames получает приоритет над отображением в window.location.

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

if (document.location.tagName == 'IMG') alert('Hello!')
Фил Хамер
источник
2
Нет приоритета, он просто перезаписан
Pacerier
7
Нет, это не перезаписано. Это затенено, поэтому Фил прав в том, что элемент имеет приоритет во время разрешения свойства.
Кангакс
@kangax, похоже, ты прав: jsfiddle.net/uL4ysszr . Но насколько надежно это поведение? Это достаточно кросс-браузер?
Pacerier
1
Только что проверил (октябрь 2016). Похоже, что window.locationи document.locationне может быть скрыт в Chrome или Firefox.
Мистер Лама
1
@ Mr.Llama Вы правы. Похоже, что все современные браузеры больше не ведут себя так, как я описал выше. Кажется, это происходит из-за присвоения document.location атрибута «Unforgeable». Соответствующее изменение Chromium: src.chromium.org/viewvc/blink?view=revision&revision=189862 И ошибка Firefox: bugzilla.mozilla.org/show_bug.cgi?id=1133760
Фил Хамер,
27

Насколько я знаю, оба одинаковы. Для кросс-браузерной безопасности вы можете использовать window.locationвместо document.location.

Все современные браузеры document.locationсоответствуют window.location, но я все еще предпочитаюwindow.location поскольку это то, что я использовал, так как я написал свою первую веб-страницу. это более последовательно.

Вы также можете увидеть document.location === window.locationрезультаты true, которые поясняют, что оба одинаковы.

Альфа-самец
источник
14

document.location === window.location возвращается true

также

document.location.constructor === window.location.constructor является true

Примечание: только что протестировано на Firefox 3.6, Opera 10 и IE6

ТЫ
источник
1
@Pacerier Почему? Для объектов ===и ==эквивалентны.
Марк Эми
4
@MarkAmery, это неправильно и может быть легко продемонстрировано: "abc" == new String("abc")возвращается, trueа "abc" === new String("abc")возвращается false.
Pacerier
7
@Pacerier Хорошо, позвольте мне заявить, что это немного более строго и менее двусмысленно: при сравнении двух объектов друг с другом (а не просто объекта с чем-либо), ==и ===они эквивалентны. См. Разделы спецификаций 11.9.3 и 11.9.6. Для ненулевых, неопределенных, ненулевых, ненулевых, ==нестроковых значений с одним и тем же типом поведение регулируется 11.9.3 часть 1f, а ===поведение - 11.9.6 часть 7, которая идентично читает Return trueif х и у относятся к одному и тому же объекту. В противном случае вернитесь false.
Марк Амери
10
@MarkAmery, нет гарантии, что оба document.locationи window.locationуказывают на объекты. Вы упускаете всю точку тройных равных; использование 2-х равных не доказывает, что они являются одним и тем же объектом. Мы должны использовать 3 равных, а не 2 равных, потому что 2 равных дают нам ложный положительный результат. В браузере, в котором document.location представляет собой строку URL, равную window.location.toString(), Тогда document.location==window.locationвернет true, а document.location===window.locationвернет false.
Pacerier
@Pacerier Ага - я наконец понял. Вы совершенно правы, по крайней мере, в том, что касается document.location === window.locationсравнения. .constructorЯ думаю, что тот факт, что это сравнение тоже означает, означает, что этот ответ по-прежнему обоснован, но его использование ===упростит рассуждения.
Марк Эмери
11

Да, они одинаковы. Это одна из многих исторических причуд в браузере JS API. Попробуйте сделать:

window.location === document.location
Мэтью Флэшен
источник
8

window.location является более надежной последовательностью, учитывая старые браузеры.

Дейв Уорд
источник
3

Редко можно увидеть разницу в наше время, потому что HTML 5 больше не поддерживает наборы фреймов. Но в то время, когда у нас есть frameset, document.location перенаправляет только фрейм, в котором выполняется код, а window.location перенаправляет всю страницу.

Маркиньо Пели
источник
2

Я бы сказал, window.locationэто более надежный способ получения текущего URL . Ниже приводится разница между window.locationиdocument.url что появилось в одном из сценариев, когда я добавлял параметры хеша в URL и читал его позже.

После добавления хеш-параметров в URL.

В более старом браузере я не мог получить параметры хеша из URL с помощью document.url, но когда я использовалwindow.location я смог получить параметры хеша из URL.

Так что всегда лучше использовать window.location.

azhar_salati
источник
1
-1. Вопрос даже не упоминается document.URL- речь шла о window.locationи document.location. Кроме того, document.urlне существует = это должно быть в верхнем регистре.
Марк Амери
2

document.location.constructor === window.location.constructor является true .

Это потому, что это точно такой же объект, как вы можете видеть из document.location===window.location .

Поэтому нет необходимости сравнивать конструктор или любое другое свойство.

Гена Карасева
источник
2

По крайней мере, в IE, он имеет небольшую разницу в локальном файле:

document.URL вернет "file: // C: \ projects \ abc \ a.html"

но window.location.href вернет "file: /// C: /projects/abc/a.html"

Один слеш, другой слеш

Джастин
источник
2

Ну да, они одинаковые, но ....!

window.location не работает в некоторых браузерах Internet Explorer.

divHelper11
источник
0

Несмотря на то, что большинство людей рекомендуют здесь, вот как динамический протокол Google Analytics выглядел целую вечность (до того, как они недавно перешли из ga.js в analytics.js):

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

Дополнительная информация: https://developers.google.com/analytics/devguides/collection/gajs/

В новой версии они использовали «//», поэтому браузер может автоматически добавлять протокол:

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

Так что, если Google предпочитает document.location чтобы , window.locationкогда они нуждаются в протоколе в JS, я предполагаю , что у них есть какие - то причины для этого.

ОБЩИЕ СВЕДЕНИЯ : Я лично считаю, что это одно document.locationи window.locationто же, но если гигант с самой большой статистикой об использовании браузеров, таких как Google, использует document.location , я рекомендую следовать им.

Kainax
источник
2
Однако я не отрицал, что это может быть потому, что это действительно старый вопрос, и ваш ответ не дает никаких новых или ценных доказательств того, что один лучше другого. Или это может быть потому, что ваш ответ предполагает противоположность общественному мнению, независимо от того, какую заслугу вы дали тому, что Google делал исторически. Или это может быть то, что downvoter просто не понравилось, как вы делаете акцент на тех частях ответа, которые действительно не нуждаются в акценте. Может быть что угодно на самом деле. В этом красота анонимного голосования на SO.
М.Бабкок
0

На самом деле я замечаю разницу в chrome между обоими. Например, если вы хотите выполнить переход к изолированному фрейму из дочернего фрейма, вы можете сделать это только с document.location, но не с window.location

M.Abulsoud
источник