Как предотвратить диалоговое окно «Подтверждение повторной формы формы»?

Как очистить информацию в форме после отправки, чтобы она не отображала эту ошибку после обновления страницы?

См. Изображение (от хрома):

В диалоговом окне есть текст:

Страница, которую вы ищете
информацию, которую вы ввели. Возвращаясь к этому
может привести к любым действиям, которые
повторяется. Вы хотите продолжить?

Я хочу, чтобы этот диалог не появлялся.

Related of "Как предотвратить диалоговое окно «Подтверждение повторной формы формы»?"

Редактировать: Прошло несколько лет с тех пор, как я изначально опубликовал этот ответ, и хотя у меня появилось несколько оборотов, я не очень доволен своим предыдущим ответом, поэтому я полностью его переделал. Надеюсь, это поможет.


Когда использовать GET и POST :

Один из способов избавиться от этого сообщения об ошибке заключается в том, чтобы ваша форма использовала GET вместо POST . Просто имейте в виду, что это не всегда подходящее решение (см. Ниже).

Всегда используйте POST, если вы выполняете действие, которое вы не хотите повторять, если передается конфиденциальная информация или если ваша форма содержит либо загрузку файла, либо длину всех отправленных данных длиннее, чем ~ 2000 символов .

Примеры использования POST включают:

  • Форма входа
  • Контактная форма
  • Отправить форму оплаты
  • Что-то, добавляющее, редактирует или удаляет записи из базы данных
  • Загрузка изображения (обратите внимание, что если вы используете GET с полем <input type="file"> , на сервер будет отправлено только имя файла, что 99.73% времени не то, что вы хотите.)
  • Форма со многими полями (которая создавала бы длинный URL-адрес при использовании GET)

В любом из этих случаев вы не хотите, чтобы люди обновляли страницу и повторно отправляли данные. Если вы отправляете конфиденциальную информацию, использование GET будет не только неуместным, это будет проблема безопасности ( даже если форма отправлена ​​AJAX ), поскольку чувствительный элемент (например, пароль пользователя) отправляется в URL-адрес и, следовательно, отображается в журналах доступа к серверу.

Используйте GET для всего остального. Это означает, что если вы не возражаете, если оно повторяется, для чего-либо, на что вы могли бы предоставить прямую ссылку, когда никакая конфиденциальная информация не передается, когда вы уверены, что ваши длины URL не выйдут из-под контроля и когда ваши формы не имеют загрузки файлов.

Примеры включают:

  • Выполнение поиска в поисковой системе
  • Форма навигации для навигации по сайту
  • Выполнение разовых действий с использованием пароля nonce или single use (например, ссылка «отписаться» в электронном письме).

В этих случаях POST будет совершенно неуместным. Представьте, если поисковые системы использовали POST для своих поисков. Вы будете получать это сообщение каждый раз, когда обновляете страницу, и вы не сможете просто скопировать и вставить URL-адрес результатов людям, им придется вручную заполнить форму самостоятельно.

Если вы используете POST :

Для меня, в большинстве случаев, даже если появляется диалоговое окно «Подтверждение формы повторной подачи», это показывает, что существует дефект дизайна. По самой природе POST , используемой для выполнения деструктивных действий, веб-дизайнеры должны препятствовать пользователям когда-либо выполнять их более одного раза случайно (или намеренно), обновляя страницу. Многие пользователи даже не знают, что означает этот диалог, и поэтому просто нажимают «Продолжить». Что, если это было после запроса «отправить платеж»? Платеж снова отправляется?

Ну так что ты делаешь? К счастью, у нас есть шаблон Post / Redirect / Get . Пользователь отправляет запрос POST на сервер, сервер перенаправляет браузер пользователя на другую страницу, и эта страница затем извлекается с помощью GET.

Вот простой пример использования PHP:

 if(!empty($_POST['username'] && !empty($_POST['password'])) { $user = new User; $user->login($_POST['username'], $_POST['password']); if ($user->isLoggedIn()) { header("Location: /admin/welcome.php"); exit; } else { header("Location: /login.php?invalid_login"); } } 

Обратите внимание, что в этом примере, даже когда пароль неверен , я все еще перенаправляюсь обратно в форму входа. Чтобы отобразить неверное сообщение для входа пользователю, просто выполните что-то вроде:

 if (isset($_GET['invalid_login'])) { echo "Your username and password combination is invalid"; } 

Это не имеет никакого отношения к вашей форме или значениям в ней. Браузер запускается браузером, чтобы пользователь не повторял тот же запрос с кэшированными данными. Если вам действительно нужно включить обновление страницы результатов, вы должны перенаправить пользователя либо через PHP ( header('Location:result.php'); ), либо другой язык на стороне сервера, который вы используете. Решение метатеги должно также работать, чтобы отключить повторную отправку при обновлении.

После обработки страницы POST перенаправьте пользователя на ту же страницу.

На http://test.com/test.php

 header('Location: http://test.com/test.php'); 

Это избавится от поля, так как обновление страницы не будет повторно отправлять данные.

У меня была ситуация, когда я не мог использовать ни один из вышеперечисленных ответов. Мое дело касалось работы со страницей поиска, на которой пользователи получили бы «подтверждение формы повторной подачи», если после щелчка по ней перейти к любому из результатов поиска. Я написал следующий javascript, который работал вокруг проблемы. Это не замечательное решение, так как оно немного модно, и оно не работает на IE8 или ранее. Тем не менее, хотя это может быть полезно или интересно для кого-то, кто занимается этой проблемой.

 jQuery(document).ready(function () { //feature test if (!history) return; var searchBox = jQuery("#searchfield"); //This occurs when the user get here using the back button if (history.state && history.state.searchTerm != null && history.state.searchTerm != "" && history.state.loaded != null && history.state.loaded == 0) { searchBox.val(history.state.searchTerm); //don't chain reloads history.replaceState({ searchTerm: history.state.searchTerm, page: history.state.page, loaded: 1 }, "", document.URL); //perform POST document.getElementById("myForm").submit(); return; } //This occurs the first time the user hits this page. history.replaceState({ searchTerm: searchBox.val(), page: pageNumber, loaded: 0 }, "", document.URL); }); 

Кажется, вы ищете шаблон Post/Redirect/Get .

В качестве другого решения вы можете перестать использовать перенаправление вообще.

Вы можете обрабатывать и обрабатывать результат обработки сразу без предупреждения о подтверждении POST . Вы должны просто манипулировать объектом истории браузера:

 history.replaceState("", "", "/the/result/page") 

Просмотреть полные или короткие ответы

У меня такая же проблема,

это сработало для меня,

 echo("<script>location.href = 'http://localhost/pagename.html';</script>");