[web] перезагрузка страницы при нажатии кнопки "назад"

Marinavo_0507

Можно ли надёжно сделать, чтобы при нажатии кнопки "назад" в браузере содержимое странички загружалось не из кеша, а заново с сервера? Или, как вариант, чтобы вообще нельзя было туда вернуться.
Страничка получается как результат POST-запроса.
Заголовок "Cache-control: no-cache, must-revalidate" не помогает.

Dasar

Или, как вариант, чтобы вообще нельзя было туда вернуться.
или посылать ajax-ом, или модифицировать историю браузера

Marinavo_0507

а нельзя просто сделать, чтоб какой-нибудь javascript вызвался, когда на страницу заходят повторно?
в интернете я нашёл только, как перехватывать покидание страницы, в том числе через кнопку "назад" - но этот вариант не подходит, потому что на моей страничке расположена формочка, которая посылает клиента на другой сайт, не под моим контролем - так вот нужно, чтобы на тот сайт не отправлялись несколько раз одни и те же данные

Dasar

а нельзя просто сделать, чтоб какой-нибудь javascript вызвался, когда на страницу заходят повторно?
такое есть в виде хаков, на надежное решение я бы не рассчитывал

Dasar

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

okis

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

Marinavo_0507

перекидывание происходит, когда юзер нажимает кнопку Submit в форме
можно ли как-то сделать, чтоб при этом данные в формочке менялись (взяв с сервера новые данные и только потом отправлялся POST-запрос?
по идее ajax для этого, но я слышал, что это сложно, а мне нужно относительно простое решение, потому что сложный способ решить эту проблему я уже знаю
то есть я могу например взять чужой пример, и вставить туда свои поля, или могу сам придумать буквально несколько строк, если известно, в каком мануале написано всё нужное, а что-то более сложное уже не требуется :)

Dasar

можно ли как-то сделать, чтоб при этом данные в формочке менялись (взяв с сервера новые данные и только потом отправлялся POST-запрос?
можно. Да, через ajax. Если брать jquery, то будет не сложно, если есть хоть какое-то знакомство с js

Marinavo_0507

я тут подумал
а можно просто в функции onclick задизаблить кнопку, а потом сделать form.submit ?

Bibi

конечно можно. неужели клиентской валидации на сайтах не видел?

Bibi

это поведение зависит от браузера. например, опера будет показывать страницу без перезапроса.
не уверен, что произойдет, если воткнуть в html-заголовок страницу meta refresh или meta http-equiv redirect — надо проверять

Bibi

нужно, чтобы на тот сайт не отправлялись несколько раз одни и те же данные
вообще не доверяй такую логику клиентской части

Dasar

http://en.wikipedia.org/wiki/Post/Redirect/Get
в данном случае это не поможет. на начальную страницу всё равно же можно вернуться и заново нажать отправить
ps
PRG помогает только убрать ситуацию, когда браузер спрашивает у пользователя - а вы уверены, что заново хотите отправить данные?

luna89

в данном случае это не поможет. на начальную страницу всё равно же можно вернуться и заново нажать отправить

Да, я невнимательно прочитал вопрос.

fufa58

на начальную страницу всё равно же можно вернуться и заново нажать отправить
Меня терзают смутные сомнения, что например в опере был шорткат типа "отправить форму в новой вкладке". Соответвенно вкладка с заполненной формой никуда не девается,и можно её переотправлять сколько душе угодно.

Marinavo_0507

вообще не доверяй такую логику клиентской части
в моём случае посылать одинаковые запросы не в интересах пользователя, просто он об этом не знает, а инструкцию прочитает уже после того, как случится неприятность
так что самая простая "защита" его спасёт

Marinavo_0507

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

Temach

пусть изначально кнопка задизаблена. аякс запрос отсылает данные к тебе на сервер где проверяется не оотправлялись ли ещее такиие данные? еслии нет то аякс запрос энейблид кнопку у которой по онклику стоит опять же ее задизабливание и уже затем идет форм сабмит. все это строк 10-20 кода

Alena_08_11

Убери вообще сабмит из формы. Вкорячь обычную кнопку/div/etc, повесь на неё onclick и в процедуре онклика делай document.formName.submit предварительно проверив условие.

Marinavo_0507

да, так и делаю, с проверкой через ajax
сильно больше 20 строк получается

Dasar

так пости сюда получающееся решение.
ps
тебя скорее всего обосрут, но решение станет короче :grin:

avmartynenko

ну или реально, чтобы вообще туда нельзя было вернуться - добавить в скрипт 3 строчки типа таких для изменения истории браузера
 
window.onbeforeunload = function {
location.replace('http://www.google.com');
}

pitrik2

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

uncle17

onbeforeunload далеко не во всех работает, но вообще правильно

luna89

Вообще говоря, не очень понятно что вообще требуется автору?
Если нужна защита от повторного сабмита, то общепринятой практикой является post-redirect-get. Или что-то другое нужно?

Marinavo_0507

общепринятой практикой является post-redirect-get
можно пояснить?

luna89

можно пояснить?
http://en.wikipedia.org/wiki/Post/Redirect/Get

Marinavo_0507

Как-то так получается, уже больше 20 строк, и это без серверной части.
Функция вешается на кнопку Submit.
Ничего браузеро-специфичного нет здесь?

function submitclick(geturl, ordernumber, clid) {
document.getElementById("ReturnButtonDiv").style.display = "block";
document.getElementById("ProgressText").innerHTML="Обработка запроса...";
document.getElementById("SubmitButton").disabled = "true";
document.getElementById("SubmitButtonDiv").style.display = "none";
$.ajax({
'url' : geturl,
'type' : 'GET',
'data' : {
'account' : clid,
'ordernumber' : ordernumber
},
'success' : function(data) {
document.getElementById("ProgressText").innerHTML="";
if (data == "ok") {
document.getElementById("Form1").submit ;
} else {
alert("Продолжение невозможно. Используйте кнопку 'Вернуться'" +
" для повторной попытки.");
}
}
});
}

Marinavo_0507

PRG implements bookmarks and the refresh button in a predictable way that does not create duplicate form submissions.
С букмарками и кнопкой "refresh" проблем не было, проблема с кнопкой "назад".

luna89

С букмарками и кнопкой "refresh" проблем не было, проблема с кнопкой "назад".
Я на 100% не уверен, но вроде с кнопкой назад тоже нет проблем.

luna89


document.getElementById("SubmitButtonDiv").style.display = "none";

Можно заменить на

$("#SubmitButtonDiv").hide;

Marinavo_0507

Я на 100% не уверен, но вроде с кнопкой назад тоже нет проблем.
ну нужно было, чтобы пользователь не мог вернуться, нажать кнопку ещё раз и послать в результате повтороный запрос
я не вижу, какие редиректы могут ему помешать

luna89

ну нужно было, чтобы пользователь не мог вернуться,
Вернуться кнопкой back?

Marinavo_0507

в идеале никаким способом нельзя должно быть
ну то есть специально хакать никто не будет, потому что это не в их интересах - но никакие интуитивно верные действия не должны приводить к повторной посылке формы

Temach

Как-то так получается, уже больше 20 строк, и это без серверной части.Функция вешается на кнопку Submit.Ничего браузеро-специфичного нет здесь?
больше но не сильно
в принципе о таком решении и шла речь. у тебя тут всего то 9 операторов.
а серверную часть напиши на основе кукисов или даже может быть сессии

Marinavo_0507

это поведение зависит от браузера.
забавно, как мозилла мой скрипт обрабатывает
если вернуться, что кнопка submit видна, но задизаблена - только часть изменений сохраняется, жесть

stm6692945

Можно ли надёжно сделать, чтобы при нажатии кнопки "назад" в браузере содержимое странички загружалось не из кеша, а заново с сервера? Или, как вариант, чтобы вообще нельзя было туда вернуться.
Страничка получается как результат POST-запроса.
Заголовок "Cache-control: no-cache, must-revalidate" не помогает.
че, плохо без шаллера )

Marinavo_0507

это не для форума :)

luna89

В общем, мне казалось, что нажимая кнопку back нельзя вернуться на форму до редиректа. Проверил, оказалось что можно.

pitrik2

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

Marinavo_0507

сервер этого делать не хочет

naska79

сервер этого делать не хочет
Можно и на клиенте запомнить - в какой-нить куке или типа того.
Или в своем вспомогательном сервере :)
Оставить комментарий
Имя или ник:
Комментарий: