Разница между 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 браузер спросит вас , если вы хотите отправить данные , чтобы перезагрузить страницу
wimh
3
@ Wimmel, есть ли способ отключить это сообщение?
Крис-я
40
window.location.href = window.location.href не будет перезагружать страницу, если в URL есть якорь (#) - в этом случае вы должны использовать window.location.reload ().
W3Max
5
Также обратите внимание, что location.reload () также принудительно перезагружает весь статический контент (очень похоже на жесткое обновление в стиле ctrl + f5), тогда как установка location.href обратно на href (или pathname или URL) - нет, что может быть значительным не нужно) разница во времени загрузки на некоторых страницах.
Роб Ван Дам
2
@Wimmel Chrome: перезагружает страницу с помощью GET Firefox: повторно выполняет предыдущий запрос, то есть, если это был POST, вы получите приятное всплывающее окно с вопросом, следует ли повторно отправить данные или нет
Juri
51

Если вы говорите, window.location.reload(true)браузер пропустит кэш и перезагрузит страницу с сервера. window.location.reload(false)сделаем наоборот

Примечание: defaultзначение window.location.reload()ISfalse

микрофон
источник
5
@Ismail - по умолчанию false.
Тревор
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
Не все браузеры имеют эту проблему с окончанием шляпы. Если вам важны конечные хэши, попробуйте: window.location = document.URL.replace (/ # $ /, '');
Вальтер Стабош
1
По крайней мере, Chrome обеспокоен. Раньше я считал location.href = location.hrefсамо собой разумеющимся, но я просто заметил такое поведение и пришел к ТАК, чтобы распространить информацию. Просто используйте location.reload()вместо этого.
Пиуль
1
Вы также можете использовать window.location.pathname вместо написания такого регулярного выражения. Например:window.location.replace(window.location.pathname);
Арсений
20

Если вы добавите логическое значение true для перезагрузки, window.location.reload(true)оно будет загружено с сервера.

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

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

В целях документации я бы использовал window.location.reload (), потому что это то, что вы хотите сделать.

mplungjan
источник
Посмотрите на stackoverflow.com/a/5091619/429972, так как это объясняет разницу.
Jontro
14

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

if (!window.location.hash) {
    window.location.href = window.location.href;
} else {
    window.location.reload();
}
minterior
источник
6

Столкнулся с этим вопросом, исследуя какое-то ненормальное поведение в IE, в частности IE9, не проверял старые версии. Похоже на то

window.location.reload();

приводит к обновлению, которое отключает весь экран на секунду, где, как

 window.location = document.URL;

обновляет страницу намного быстрее, почти незаметно.

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

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

invertedSpear
источник
window.location = document.URL перезагрузит страницу точно так же, как window.location.reload (). Есть ли современный уровень освежения без прокрутки назад или незаметно, как вы сказали?
bigmugcup
6

Отличие в Firefox (12.0) состоит в том, что на странице, отображаемой из POST, reload () выдаст предупреждение и сделает повторную публикацию, в то время как назначение URL выполнит GET.

Google Chrome делает GET для обоих.

MRJ
источник
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 , то загружается версия кеша ...

kumarharsh
источник
0

В нашем случае мы просто хотим перезагрузить страницу в веб-просмотре, и по некоторым причинам мы не могли понять почему! Мы пробуем почти все решения, которые были в сети, но застряли без перезагрузки, используя location.reload () или альтернативные решения, такие как window.location.reload (), location.reload (true), ...!

Вот наше простое решение:

Просто используйте тег <a> с пустым значением атрибута "href", например так:

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

(в некоторых случаях вы должны использовать «return true» при нажатии на цель, чтобы вызвать перезагрузку)

Для получения дополнительной информации проверьте этот вопрос: действителен ли пустой href?

Метро Полисуе
источник
-3

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

Рони Сильва
источник