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

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

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

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

Страница, которую вы ищете,

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

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

Ответ 1

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


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

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

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

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

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

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

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

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

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

В этих случаях 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";
}

Ответ 2

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

Ответ 3

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

О   http://test.com/test.php

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

Это избавится от этого поля, так как обновление страницы не приведет к повторной отправке данных.

Ответ 4

У меня была ситуация, когда я не мог использовать ни один из приведенных выше ответов. Мое дело касалось работы со страницей поиска, на которой пользователи получили бы "подтверждение формы повторной подачи", если после щелчка по ней перейти к любому из результатов поиска. Я написал следующий 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);

});

Ответ 5

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

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

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

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

Смотрите полный или короткий ответ

Ответ 6

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

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

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