Как перезагрузить страницу без предупреждения POSTDATA в Javascript?
Я хочу перезагрузить страницу, используя:
window.location.reload(true);
Но я получаю предупреждение POSTDATA, потому что функция обновления хочет отправить предыдущие данные формы POST. Как я могу обновить мою страницу без этого предупреждения?
ОБНОВЛЕНО: У меня нет контроля над проектом! Я не могу обойти сам POST!
17 ответов
Просто меняется window.location
в JavaScript это опасно, потому что пользователь все еще может нажать кнопку "Назад" и повторно отправить сообщение, что может привести к неожиданным результатам (например, повторная покупка). PRG - намного лучшее решение
Используйте шаблон Post/Redirect/Get (PRG)
Чтобы избежать этой проблемы, многие веб-приложения используют шаблон PRG - вместо прямого возврата HTML-страницы операция POST возвращает команду перенаправления (используя код ответа HTTP 303 (иногда 302) вместе с заголовком ответа HTTP "Location"), указание браузеру загрузить другую страницу с помощью HTTP-запроса GET. Страницу результатов можно безопасно добавить в закладки или перезагрузить без неожиданных побочных эффектов.
Вы не можете обновить без предупреждения; Обновление инструктирует браузер повторить последнее действие. Браузер сам выбирает, предупреждать ли пользователя, если повторение последнего действия связано с повторной отправкой данных.
Вы можете повторно перейти на ту же страницу со свежим сеансом, выполнив:
window.location = window.location.href;
У меня были некоторые проблемы с anchor/hash-urls (включая #), не перезагружая, используя решение от Rex...
Итак, я наконец-то удалил часть хеша:
window.location = window.location.href.split("#")[0];
Чтобы обойти предупреждение POST, вы должны перезагрузить страницу с полным URL. Работает отлично.
window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname;
Вы можете использовать JavaScript:
window.location.assign(document.URL);
Работал для меня на Firefox и Chrome
проверьте эту ссылку: http://www.codeproject.com/Tips/433399/PRG-Pattern-Post-Redirect-Get
Это сработало
<button onclick="window.location.href=window.location.href; return false;">Continue</button>
Причина, по которой это не сработало без
вернуть ложь;является то, что ранее он рассматривал это как кнопку отправки формы. С явным возвратом false он не выполняет отправку формы, а просто выполняет перезагрузку той же страницы, которая была результатом предыдущего POST на эту страницу.
Версия Nikl не передает параметры запроса get, я использовал следующую модифицированную версию:
window.location.href = window.location.protocol +'//'+ window.location.host + window.location.pathname + window.location.search;
или в моем случае мне нужно было обновить верхнюю страницу \ фрейм, поэтому я использовал следующую версию
window.top.location.href = window.top.location.protocol +'//'+ window.top.location.host + window.top.location.pathname + window.top.location.search;
Если вы находитесь на этапе, когда вы закончили с данными публикации и просто хотите снова просмотреть страницу заново, вы можете просто использовать window.location и даже, возможно, добавить случайную строку в качестве параметра запроса, чтобы гарантировать новую версию стр.
<html:form name="Form" type="abc" action="abc.do" method="get" onsubmit="return false;">
method="get"
- решает проблему.
if method="post"
тогда приходит только предупреждение.
Вы не обязаны использовать JavaScript, чтобы делать все. Многие проблемы имеют простые решения, такие как эта. Вы можете использовать этот хитрый якорь:
<a href=".">Continue</a>
Конечно, я знаю, что вам может понадобиться автоматическое решение, но это поможет во многих случаях.
удачи
Я написал функцию, которая будет перезагружать страницу без отправки сообщения, и она будет работать с хешами.
Я делаю это, добавляя / изменяя параметр GET в URL-адресе reload
обновив его значение текущей меткой времени в мс.
var reload = function () {
var regex = new RegExp("([?;&])reload[^&;]*[;&]?");
var query = window.location.href.split('#')[0].replace(regex, "$1").replace(/&$/, '');
window.location.href =
(window.location.href.indexOf('?') < 0 ? "?" : query + (query.slice(-1) != "?" ? "&" : ""))
+ "reload=" + new Date().getTime() + window.location.hash;
};
Имейте в виду, что если вы хотите вызвать эту функцию в атрибуте href, реализуйте ее следующим образом: href="javascript:reload();void 0;"
заставить его работать успешно.
Недостатком моего решения является то, что он изменит URL, так что эта "перезагрузка" не является реальной перезагрузкой, вместо этого это загрузка с другим запросом. Тем не менее, это может соответствовать вашим потребностям, как и для меня.
Другие решения с window.location
у меня не сработало, поскольку они вообще не обновляли его, поэтому я использовал пустую форму для передачи новых и пустых постданных на ту же страницу. Это способ сделать это на основе этого ответа:
function refreshAndClearPost() {
var form = document.createElement("form");
form.method = "POST";
form.action = location.href;
form.style.display = "none";
document.body.appendChild(form);
form.submit(); //since the form is empty, it will pass empty postdata
document.body.removeChild(form);
}
Используя мета-обновление в HTML
<meta http-equiv='refresh' content='1'>
используя метаобновление в php
echo "<meta http-equiv='refresh' content='1'>"
Вот решение, которое должно работать всегда и не удаляет хэш.
let currentPage = new URL(window.location.href);
currentPage.searchParams.set('r', (+new Date * Math.random()).toString(36).substring(0, 5));
window.location.href = currentPage.href;
Если вы используете GET
метод вместо POST
тогда мы не можем формы поданных значений. Если вы используете window.opener.location.href = window.opener.location.href;
тогда мы можем запустить БД, и мы можем получить значение, но единственное, что JSP
не обновляет событие, хотя скрипт имеет значения формы.