борьба с просьбой браузера перезаполнить форму

tihon972009

Есть форма поиска, составленная через POST.
При ее заполнении выдаются результаты, разбитиые на страницы, номера которых передаются через GET (ибо а как еще? поэтому, чтобы между страницами сохранялись данные формы (поскольку пользователь не может одновременно тыкнуть и на номер страницы и на кнопку отправки формы соотв. ключи массива POST передаются через SESSION.
Это о предмете.
Теперь проблема: из-за того, что форма POST, браузер при нажатии на нее кнопки back предлагает каждый раз обновить в ней данные (данные в ней не должны обновляться (т.е. должны выдаваться результаты предварительно заполненной формы; даже при возврате со страниц, не отноящихся к поиску) кроме специальных случаев, явно описанных в коде отдельно) - FF выдает alert с вопросом, IE вообще показывает ужасную белую страницу, короче, пользователю неудобно, что приводит к некоторым потерям пользователей (кот.
1. Можно ли заставить браузер не просить подтверждение на заполнение формы, а выдавать ее сразу заполенной (на основе того, что в SESSION)?
(была идея в нужных случаях сделать редирект, чтобы POST-запрос отправлялся с пустым телом и браузер, соответственно, не просил второй раз заполнить форму, но так получится бесконечный цикл, потому что так сттаница все время перенаправляется сама на себя).
2. Есть ли объективные против использования в данном случае GET?
upd: короче, вопрос коротко формулируется так - как заставить браузер не просить перезаполнить форму POST, если человек вернулся на страницу, где такая форма была заполнена

klyv

хмм... а что насчёт кукисов?

klyv

перечитал. :)
заполняй форму на основе сохранённых данных для сессии - так будет красиво и просто.
данные о сессии проще передавать в кукисах, чтобы не засорять строку адреса.
а номер странице в GET - ит стандартное отношение к делу, по-моему
PS. Да ты и сам всё знал :)

tihon972009

> заполняй форму на основе сохранённых данных для сессии - так будет красиво и просто.
я так и делаю. ТАм проблема не данные передать, а заставить браузер не просить перезаполнить форму POST, если человек вернулся на страницу, где она была заполнена.
> номер странице в GET - ит стандартное отношение к делу, по-моему
я тоже так думаю. Но заказчик считает, что будет некрасивый url (там реально будет некрасивый - параметров в форме может быть несколько десятков ближе к сотне).

klyv

ты имеешь ввиду самую первую страницу, где пользователь ввёл данные?
(самую-самую)
тогда передавай их GET'ом, записывай в сессию (или делай идентификатор запроса в БД делай редирект на первую страницу результата, у которой в строке адреса будут параметрами только идентификатор запроса и номер страницы

tihon972009

> ты имеешь ввиду самую первую страницу, где пользователь ввёл данные?
> (самую-самую)
именно.
> тогда передавай их GET'ом, записывай в сессию (или делай идентификатор запроса в БД
> делай редирект на первую страницу результата, у которой в строке адреса будут параметрами
> только идентификатор запроса и номер страницы
погоди, это ж, получается, вроде что форму нужно переписывать через GET (или я не так понял?). А это из условий задачи нельзя.

klyv

хмм...
браузер выдаёт неприятные сообщения только когда мы заходим на страницу, в запросе на которую были переданы POST-данные.
так что оставляем форму POST, рещзультат которой - редирект (GET в том абзаце - скорее всего ошибка засыпающего человека :))

livemix

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

kruzer25

Кстати, вот такая немного подходящая задача - когда мы жопоскриптом обновляем страницу с формой, ФФ оставляет заполненными все формы (т.е. ввели в поле текст, нажали на кнопочку, которая обновляет страницу через JS - а текст в поле остался, и у пользователя ощущение, что ничего не произошло).
Можно ли с этим как-нибудь прилично бороться (прилично - это, например, не передавать через GET случайное число, чтобы фф думал, что это другая страница)?

Andbar

Заполнять форму в window.onload?
А вообще, имхо, бороться с подобными фичами браузеров не правильно. Меня, например, бесят сайты, на которых предприняты меры для того, чтобы большинство пассворд менеджеров не могли пароль сохранить.

kruzer25

Заполнять форму в window.onload?
В принципе, вариант, но это тоже какое-то полуанальное решение.
А вообще, имхо, бороться с подобными фичами браузеров не правильно
В данном случае - правильно.
Человек заполнил форму добавления нового треда на странице со списком тредов, нажал "отправить" - данные ушли, страница обновилась - а человек в это время вообще в другое окно смотрел; вернулся, видит - в форме данные остались. Большинство людей в таком случае в список тредов не глядят, свой тред не ищут, а считают, что, например, забыли нажать на кнопку "отправить" - и жмут ещё раз.

pitrik2

тебе правильно ответил
правда он как-то слишком длинно выразился, но смысл тот

pitrik2

нажали на кнопочку, которая обновляет страницу через JS
не понял :(
т.е. после нажатия на кнопочку делается вот это? :
1) отправляются данные на сервер (например ajax)
2) window.location.reload
а вообще если window.onload работает (т.е. лисья фича срабатывает ДО него) то можно в window.onload вызывать reset формы

kruzer25

1) отправляются данные на сервер (например ajax)
2) window.location.reload
Да.
а вообще если window.onload работает (т.е. лисья фича срабатывает ДО него) то можно в window.onload вызывать reset формы
Тут уже сказали про это.
Неужели такая говнофича никакими прямыми способами не отключается? :crazy:

pitrik2

Тут уже сказали про это.
Неужели такая говнофича никакими прямыми способами не отключается?
где это? до меня никто про ресет не говорил
что ты называешь прямым способом?
помойму ресет вполне прямой способ

pitrik2

а вообще можешь задизаблить автокомплит
<form autocomplete = "off">
но тогда он задизаблиться полностью, а не как ты хочешь частично

kruzer25

но тогда он задизаблиться полностью
Ага, и во всех браузерах :crazy:
И, кстати, не факт, что это поможет против этой фишки фф.

Andbar

Какие элементы есть на форме?
Текстареа точно не автокомплитится

kruzer25

Разные - и простые текстовые поля, и текстареа, и радио, и чекбоксы, и селекты.
Доходит до смешного:
<select name="day">
<option value="1">1</option>
...
<option value="26" selected>26</option>
...
<option value="31">31</option>
</select>

Открываем страницу - всё отлично.
Поменяли код чуть-чуть (не самого селекта, а страницы вообще - заголовок сменили, например обновили страницу - выбрано уже не 26, а 1.
Обновляем страницу по CtrlF5 - всё хорошо, выбрано 26.
Насчёт textarea - не уверен, но вроде содержимое textarea тоже сохраняется...

Andbar

Насчёт textarea - не уверен, но вроде содержимое textarea тоже сохраняется...
...только при навигации вперёд-назад. Ну или при обновлении.
Что вполне правильно: пишу я сообщение на форуме, решил перед отправкой проверить, не появились ли новые сообщения. Жму F5. Или я должен извращаться: открывать страницу в новой вкладке или вообще, текст в буфере сохранять?

kruzer25

А вот сейчас появилась уже более-менее приличная идея - перед перезагрузкой страницы, опять же, проходим по всем формам и сбрасываем их содержимое - пользователь всё равно этого не увидит, а при обновлении страницы уже всё будет чисто.
Оставить комментарий
Имя или ник:
Комментарий: