Різниця між window.location.href = window.location.href та window.location.reload ()


196

Яка різниця між JavaScript

window.location.href = window.location.href

і

window.location.reload()

функції?

Відповіді:


247

Якщо я добре пам’ятаю, window.location.reload()перезавантажує поточну сторінку даними POST, при цьому window.location.href=window.location.hrefне включає дані POST.

Як зазначає @ W3Max в коментарях нижче, window.location.href=window.location.hrefне завантажуватиметься сторінка, якщо в URL-адресі є якір (#) - Ви повинні використовувати window.location.reload()в цьому випадку.

Крім того, як зазначає @Mic нижче, window.location.reload()приймає додатковий аргумент, skipCacheщоб за допомогою window.location.reload(true)браузера пропустити кеш і перезавантажити сторінку з сервера. window.location.reload(false)зробить навпаки, і по можливості завантажить сторінку з кеша.


11
зауважте, що при використанні window.location.reload () на POST браузер запитає вас, чи хочете ви повторно надіслати дані для перезавантаження сторінки
від

3
@Wimmel, чи є спосіб відключити це повідомлення?
Кріс-І

40
window.location.href = window.location.href не буде перезавантажувати сторінку, якщо в URL-адресі є якір (#) - Ви повинні використовувати window.location.reload () у цьому випадку.
W3Max

5
Також зауважте, що location.reload () також змусить перезавантажити весь статичний вміст (подібно до жорсткого оновлення стилю ctrl + f5), тоді як встановлення location.href назад до href (або ім'я шляху або URL) не робить, що може бути значним (і непотрібно) різниця у часі завантаження на деяких сторінках.
Роб Ван Дам

2
@Wimmel Chrome: перезавантажує сторінку з GET Firefox: повторно виконує попередній запит, тобто , якщо це був POST, ви отримаєте хороший спливаюче вікно з запитом про те , щоб відправити ці дані чи ні
Juri

51

Якщо ви скажете, window.location.reload(true)браузер пропустить кеш і перезавантажить сторінку з сервера. window.location.reload(false)зробить навпаки.

Примітка: defaultзначення для window.location.reload()єfalse


5
@Ismail - за замовчуванням неправдиво.
Тревор

2
Google Chrome 32, використовуючи webRTC, значення true / false не працювало для мене. У мене був iframe з webRTC, і тільки з використанням window.location.href = window.location.hrefзробив трюк.

Якщо ви внесли зміни у форму на сторінці, зміни можуть зникнути (повернутися до кешованих значень) залежно від браузера при використанні location.reload()або location.reload(false). Для повного оновлення сторінки використовуйте location.reload(true).
Suncat2000

32

Різниця в тому

window.location = document.URL;

не буде перезавантажувати сторінку, якщо в URL-адресі є хеш (#) (з чи ні після цього), тоді як

window.location.reload();

перезавантажить сторінку.


2
Не всі веб-переглядачі мають цю проблему із закінченням "hases". Якщо закінчення хесів викликає занепокоєння, спробуйте: window.location = document.URL.replace (/ # $ /, '');
Вальтер Стабош

1
Принаймні, це стосується Chrome. Раніше я сприймав location.href = location.hrefяк належне, але я просто помітив таку точну поведінку і прийшов до ТА, щоб поширити слово. Просто використовуйте location.reload()замість цього.
Піоул

1
Ви також можете використовувати window.location.pathname замість того, щоб писати такий регулярний вираз. Наприклад:window.location.replace(window.location.pathname);
Арсеній

20

Якщо ви додасте boolean true до перезавантаження, window.location.reload(true)він завантажиться з сервера.

Не ясно , яким чином підтримується це логічне є, W3Org згадує , що NS використовується для підтримки його

МОЖЕ бути різниця між вмістом window.location.href та document.URL - там принаймні була різниця між location.href та нестандартним та застарілим документом.location, що було пов'язано з перенаправленням, але це це справді минуле тисячоліття.

Для цілей документації я б використовував window.location.reload (), тому що це ви хочете зробити.


Подивіться на stackoverflow.com/a/5091619/429972, оскільки це пояснює різницю.
jontro

14

Як було сказано, зміна href, коли в URL-адресі є хеш (#), не перезавантажить сторінку. Таким чином, я використовую це для перезавантаження його замість регулярних виразів:

if (!window.location.hash) {
    window.location.href = window.location.href;
} else {
    window.location.reload();
}

6

Натрапивши на це питання, досліджуючи деяку ненормативну поведінку в IE, зокрема IE9, не перевіряв старі версії. Здається

window.location.reload();

приводить до оновлення, яке вимикає весь екран на секунду, де як

 window.location = document.URL;

оновлює сторінку набагато швидше, майже непомітно.

Провівши трохи більше досліджень та експериментуючи з фіддлером, схоже, що window.location.reload()це обійде кеш і перезавантажиться з сервера, незалежно від того, передаєте ви булевий з ним чи ні, це включає отримання всіх ваших активів (зображення, сценарії, таблиці стилів, тощо) знову. Тож якщо ви просто хочете, щоб сторінка оновлювала HTML, ця версія window.location = document.URLповернеться набагато швидше та з меншим трафіком.

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


window.location = document.URL перезавантажує сторінку так само, як window.location.reload (). Чи існує сучасний стан оновлення, не прокручуючи назад до вершини, або непомітно, як ви сказали?
bigmugcup

6

Відмінність Firefox (12.0) полягає в тому, що на сторінці, створеній з POST, перезавантаження () з’явиться попередження та повторне повідомлення, а призначення URL-адреси GET.

Google Chrome робить GET для обох.


1
Зараз Chrome 38, схоже, використовує POST для .reload ().
Глен Малий

3

Використовуючи JSF, у мене зараз виникає проблема з оновленням після закінчення сеансу: PrimeFaces ViewExpiredException після перезавантаження сторінки та з деяким розслідуванням я виявив одну різницю у FireFox:

Виклик window.location.reload()працює як натискання піктограми оновлення на FF, додає рядок

Cache-Control max-age=0

поки налаштування window.location.hrefпрацює як натискання клавіші ENTER у рядку URL-адреси, це рядок не надсилається.

Хоча обидва надсилаються як GET, перше (перезавантаження) відновлює попередні дані, і програма перебуває в непослідовному стані.


1

Ні, не повинно бути. Однак можливо, в деяких браузерах є відмінності, тому або (або жоден) може не працювати в деяких випадках.


1

з мого досвіду близько 3 років, я не міг знайти різниці ...

edit: так, як сказав один з них тут, різницею є лише передача булевого параметра до window.location.reload (). якщо ви передаєте true , браузер завантажує свіжу сторінку, але якщо false , то версія кешу завантажується ...


0

У нашому випадку ми просто хочемо перезавантажити сторінку у веб-перегляді, і ми з певних причин не змогли з’ясувати, чому! Ми намагаємося майже кожне рішення, яке було в Інтернеті, але застрягло без перезавантаження, використовуючи location.reload () або альтернативні рішення, такі як window.location.reload (), location.reload (true), ...!

Ось наше просте рішення:

Просто використовуйте тег <a> із порожнім значенням атрибуції "href" таким чином:

< a href="" ...>Click Me</a>

(в деяких випадках для натискання цілі вам потрібно використовувати "повернути істину", щоб викликати перезавантаження)

Для отримання додаткової інформації ознайомтеся з цим питанням: чи дійсний порожній href?


-3

window.location.href, це врятувало мені життя в веб-перегляді з Android 5.1. Сторінка не завантажується за допомогою сайту.reload () у цій версії з Android.

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