Javascript: Встановлення location.href порівняно з розташуванням


311

Коли ви встановите locationрядок URL-адреси проти налаштування location.href?

location = "http://www.stackoverflow.com";

проти

location.href = "http://www.stackoverflow.com";

Посилання на мережу розробників Mozilla


6
налаштування location.hrefпошти не вдається через політику того самого походження: javascript.info/tutorial/…
Taha Jahangir,


1
У мене є програма Angular 4, яка використовує TypeScript 2.6.2. window.location є лише для читання, і я можу призначити лише за допомогою window.location.href (в контексті зворотного дзвінка з кутової підписки), не розуміючи помилок компілятора. . В основному window.location.href здається єдиним, що завжди працює.
Кріс Халкроу

Відповіді:


261

Ви можете встановити locationбезпосередньо, тому що він трохи коротший. Якщо ви намагаєтеся бути стислими, зазвичай можете також пропустити window..

Призначення URL обом location.hrefі locationвизначається для роботи в JavaScript 1.0, назад у Netscape 2, і з цього часу реалізовується у кожному браузері. Тож візьміть свій вибір і використовуйте те, що вам зрозуміло.


9
Як згадує @SwissMister у відповіді нижче, схоже, що window.location.href дещо трактується як запит XHR. Якщо його запускають у межах успішного зворотного виклику XHR, window.location.href буде розглядатися як XHR, тоді як window.location імітує натискання на посилання.
Akshay Raje

147

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


60
Реалізуючи складну інтеграцію PayPal, я зіткнувся з дуже переконливою причиною використання window.location: цього не потрібноSAME ORIGIN .
Швейцарський містер

4
Можливо, це тільки я, але location = 'http://www.example.com'здається супер читабельним. Хоча як окремий випадок. Це сумісно назад і залишатиметься сумісним у найближчому майбутньому.
Alex W

10
Якщо window.location був об'єктом, присвоївши йому рядок, це перезаписало б його рядком. Насправді window.location - це властивість, яка має методи getter та setter. Коли ви встановите його, очікується рядок, і сетером буде оновлено глобальний об’єкт Location. Коли ви отримуєте його, повертається глобальний об’єкт Location.
JukkaP

64

Як уже було сказано, locationце об'єкт . Але ця людина запропонувала використати будь-яке. Але, вам краще буде скористатися .hrefверсією.

Об'єкти мають властивості за замовчуванням, які, якщо нічого іншого не вказано, вони вважаються. У випадку з locationоб’єктом він має властивість, що називається .href. І, не вказуючи БУДЬ-якого властивості під час призначення, він буде вважати "href" за замовчуванням.

Це все добре і добре, поки не зміниться пізніша версія об'єктної моделі і не буде більше властивості за замовчуванням, або не буде змінено властивість за замовчуванням. Тоді ваша програма несподівано зривається.

Якщо ви маєте на увазі href, вам слід вказати href.


13
Гарне пояснення, краще, ніж просто загальні коментарі щодо читабельності чи технічного обслуговування. Насправді в даному конкретному випадку об'єктна модель не буде змінена, оскільки половина Інтернету зупиниться - тому використовуйте або ... не має значення, який
Neromancer

71
Це звучить добре, але насправді не так. У DOM чи JavaScript взагалі немає поняття властивості за замовчуванням. Призначення рядка locationпрацює тому, що властивість було визначено, щоб ця особлива поведінка присвоєння була повернута в JavaScript 1.0 і кожен браузер з тих пір це реалізував. Тепер його вимагає HTML5. Таким чином, хоча це може бути гарнішим або послідовнішим присвоювати .href, немає ніякої переваги сумісності вперед або вперед для цього.
bobince

6
прискіпливість рахується.
Том Андерсен

4
window.location = urlкрасивіше
Ерік Мюйсер

21
location = urlє cuter
fregante

20

Пару років тому locationне працював для мене в IE і location.hrefробив (і обидва працювали в інших браузерах). З тих пір я завжди просто використовував location.hrefі більше ніколи не виникав проблем. Я не можу згадати, яка версія IE це була.


42
Напевно, одна версія IE, де вона робила помилки, і кожен інший браузер робив це правильно. ;-)
Шон Д.

9
у strict modechrome викине виняток, якщо ви спробуєте призначити його locationтеж, тому я завжди використовуюlocation.href
Hashbrown

9
"одна" версія IE?
Lpc_dark

@Shawn D. Веб-переглядач робить все правильно? Коли це сталося! : D
user2173353

15

Просто для уточнення, ви не можете зробити location.split('#'), locationце об'єкт, а не рядок. Але ти можеш зробити, location.href.split('#');тому що location.hrefце струна.


3
Ваш коментар правдивий, але ви говорите про отримання атрибута href, рядка, об'єкта місцезнаходження. Усі інші дискусії стосуються присвоєння значення, а не читання значення. Але ваша думка правильна. Різниця полягає в тому, що href - це рядок, а розташування - об'єкт.
Phil DD

15

Одна різниця, яку слід пам’ятати.

Скажімо, ви хочете створити деяку URL-адресу, використовуючи поточну URL-адресу. Наступний код насправді перенаправить вас, тому що він не дзвонить, String.replaceа Location.replace:

nextUrl = window.location.replace('/step1', '/step2');

Наступні коди працюють:

// cast to string
nextUrl = (window.location+'').replace('/step1', '/step2');

// href property
nextUrl = window.location.href.replace('/step1', '/step2');

3

При використанні TypeScript window.location.hrefяк window.locationтехнічно об'єкт містить:

Properties
hash 
host 
hostname
href    <--- you need this
pathname (relative to the host)
port 
protocol 
search 

Налаштування window.locationпризведе до помилки типу, в той час як window.location.hrefє рядком типу.

Джерело

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