Яка різниця між window.location і document.location в JavaScript?


Відповіді:


220

За даними W3C, вони однакові. Насправді для безпеки між веб-переглядачами слід скористатися, window.locationа не використовувати document.location.

Дивіться: http://www.w3.org/TR/html/browsers.html#dom-location


12
Захищений. Відповідь суперечлива. Він сміливо говорить, що вони однакові, а потім описує відмінності у більш легкому тексті. Вони, безумовно, не однакові.
Данртон

33
Зробіть тригер-щасливі виборці, трохи полегшіть. Здебільшого вони поводяться аналогічно РОЗПОВІДАЮЧИ ПЕРЕГЛЯД ПЕРЕКЛЮЧЕНОГО рахулом. Не будемо прибивати його до семантики. Трохи філадельфії, панове. Я, наприклад, вважав, що його відповідь цілком задовольняє. +1 (відповідь Крістофа має бути прийнятою, але рахульські прийнятні - принаймні, не гідні голосування)
cssyphus

7
-1 для того, щоб рекомендувати найкращу практику (завжди використовувати window.location), не надаючи жодних обґрунтувань. Якщо ви не надасте обґрунтування, навіщо хтось приймати вашу пораду? Відповідь Крістофа в цьому плані набагато корисніша.
Марк Амері

+1, але також див. Відповіді Філа Хамера та Крістофа нижче, вони додають важливу довідкову інформацію та застереження, щоб повністю зрозуміти проблему.
Jon z

Насправді я помічаю різницю між обома. Наприклад, якщо ви хочете зробити навігацію до пісочного кадру з дочірнього кадру, тоді ви можете це зробити лише за допомогою документа.локації, але не за допомогою window.location
M.Abulsoud

207

Канонічним способом отримання поточного об’єкта розташування є window.location(див. Цю сторінку MSDN з 1996 р. Та проект W3C з 2006 р.).

Порівняйте це з тим document.location, що спочатку повертався лише поточний URL у вигляді рядка (див. Цю сторінку на MSDN ). Ймовірно, щоб уникнути плутанини, document.locationйого замінили document.URL(див. Тут на MSDN ), який також є частиною рівня DOM 1 .

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


1
якщо ви використовуєте window.location, чи не однаково справедливо просто користуватися location?
commonpike

2
@commonpike Це - у контексті скрипту в [принаймні] HTML-документі об'єктом є глобальний об'єкт, де всі визначені змінні стають властивостями window. Таким чином, будь-яка змінна або функція, яку ви визначаєте на верхньому рівні вашого сценарію, є властивістю об'єкта, на який посилається, і window, як буває, є глобальним об'єктом. Глобальний об’єкт мається на увазі, коли він відсутній, як window.- отже location, інтерпретується як такий window.location. Caveats - 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 (використовуючи VM від modern.ie ).
Марк Амері

будь-які коментарі console.log(location);? !!
Fr0zenFyr

44

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

Детальніше:

document.location

window.location


Я не можу знайти чіткої відповіді, коли використовувати будь-який із них, погляньте на мою відповідь нижче
M.Abulsoud

37

Цікаво, що якщо у вас є кадр, зображення або форма з назвою "розташування", то "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 . Але наскільки надійною є така поведінка? Чи достатньо крос-браузера?
Пейсьєр

1
Щойно тестували це (жовтень 2016). Виявляється , що window.locationі document.locationне може бути затіненими в Chrome або Firefox.
Містер Лама

1
@ Mr.Llama Ви маєте рацію. Здається, усі сучасні браузери більше не ведуть себе так, як я описав вище. Це, мабуть, пов’язано з тим, що надати document.location атрибут "Unforgeable". Відповідна зміна хрому: src.chromium.org/viewvc/blink?view=revision&revision=189862 І помилка Firefox: bugzilla.mozilla.org/show_bug.cgi?id=1133760
Phil Hamer

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, яка ідентично читає повернення, trueякщо x і y посилаються на один і той же об'єкт. В іншому випадку поверніться 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 Aha - я зрозумію, нарешті. Ви цілком правильні, принаймні, що стосується document.location === window.locationпорівняння. Те, що .constructorпорівняння закинуто занадто означає, я вважаю, що ця відповідь все ще звучить, але використання ===спростить міркування.
Марк Амері

11

Так, вони однакові. Це одна з багатьох історичних химерностей API JS браузера. Спробуйте зробити:

window.location === document.location

8

window.location є надійніше послідовним із двох, враховуючи старіші браузери.


3

Зараз різко можна побачити різницю, оскільки html 5 вже не підтримує набори фреймів. Але тоді, коли ми маємо набір фреймів, document.location переспрямовує лише кадр, в якому виконується код, а window.location переспрямовує всю сторінку.


2

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

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

У старшому браузері я не зміг отримати хеш-параметри з URL-адреси за допомогою document.url, але коли я використовувавwindow.location мені вдалося отримати хеш-параметри з URL-адреси.

Тому завжди краще використовувати window.location.


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 поверне "файл: // C: \ projects \ abc \ a.html"

але window.location.href поверне "файл: /// C: /projects/abc/a.html"

Один - косою косою рискою, а другий - косою.


2

Ну так, вони однакові, але ....!

window.location не працює в деяких браузерах Internet Explorer.


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 , рекомендую дотримуватися їх.


2
Однак я не спростовував це, адже це справді давнє запитання, і ваша відповідь не дає жодних нових чи цінних доказів того, що один кращий за інший. Або це може бути тому, що ваша відповідь говорить про протилежне суспільній думці, незалежно від заслуг, які ви надаєте тому, що Google робив за минулий час. Або може статися так, що першокласнику просто не сподобалося, як ти робиш акцент на частини своєї відповіді, які не дуже потрібні наголошувати. Насправді може бути що-небудь. Ось така краса анонімного голосування на ТАК.
М.Бабкок

0

Насправді я помічаю різницю в хромі між обома. Наприклад, якщо ви хочете зробити навігацію до пісочного кадру з дочірнього кадру, ви можете це зробити просто за допомогою документа.локації, але не за допомогою вікна.локації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.