Войти

Показать полную графическую версию : Запрет на "возвращение" назад


Страниц : [1] 2

mrak1990
11-05-2007, 22:32
Появился вопрос, который пока так и не смог решить в полной мере. Делал систему проверки знаний и появилась потребность запретить пользователю возвращаться назад. Как один из вариантов можно конечно использовать обработчик:
onclick="location.replace('test.html');">meet Billy</a>
Но во превых мне готовая ссылка ни к чему, так как у меня всё построено на формах. Поэтому открытие новых страниц происходит при нажатии на кнопку "Submit".
Можно конечно (или нет?) сделать так чтобы страницы открывались каждый раз в новых окнах. При этом история будет удаляться.
Можно конечно открывать весь мой сайт в окошке безо всяких панелей, использую JavaScript.
Жду ваших идей по этому поводу. И если не трудно, то напишите полный синтаксис команды JavaScript для открытия страниц в новом окне. Заранее спасибо

Sham
12-05-2007, 00:51
mrak1990 <body onload=".....">?

mrak1990
12-05-2007, 11:14
Sham
mrak1990 <body onload=".....">?
Просто мне не очень хочется использовать JavaScript.

Но я вчера и сам нашёл решение, оказавшееся очень простым.
Превым делом я добавил во все создаваемые страницы код
header ("Cache-Control: no-cache");
Сделал для того чтобы при возвращении назад код заново обрабатывался.
Потом вставил обычный счётчик посещений.
А вкаждой генерируемой странице у меня висит переменная $nomer содержащая номер текущего вопроса.
Потом просто при каждой генерации я проверяю, равны ли эти две переменный (кол-во посещений и переменная $nomer).

Единственная что, пока всё это только в моей голове. Но посмотрим, что из всего этого получится.

mrak1990
12-05-2007, 11:51
Не совсем удалась описанная выше операция. Проблема в том, что если запрещеть браузеру кэшировать страницу и если на этой странице есть форма, то работать нифига не будет кнопка назад (браузер пишет, что "Невозможно отобразить страницу"). Если форму убрать, то нормально срабатывает запрет на кеширование и страница обновляется. Если кто знает, то подскажите, что это за такая интересная особенность и как сней бороться

Prisoner
12-05-2007, 14:36
Это они все так "странно" и закономерно себя ведут: форма - это возможность посетителя менять поведение страницы (по сути). Пусть есть три страницы: 1 - с формой, 2 - результат обработки формы сервером, 3 - там где мы сейчас есть. Если пытаться back с 3 на 2, то будет ошибка аля страница устарела (она, и верно, динамическая). Толи лениво было разрабам запоминать просто код принятый с сервера, толи я не все спеки прочел и чего-то не понимаю. Кстати, попробуйте использовать в формах метод GET, может быть это решит текущую проблему. А вообще, я бы использовал AJAX (см. прикрепленную тему) - модно, дешево и сердито.

Sham
12-05-2007, 18:20
mrak1990 я бы насчет кэширования и париться не стал :). Поведение браузеров здесь не стандартизировано (более того - подлежит настройке юзером), да и в большинстве случаев назад можно перейти в автономном режиме. Так шо - либо javascript (в т.ч. АЯХ), либо другой алгоритм (проверки на чаво-й-то-там)...

Coutty
12-05-2007, 19:13
Почему бы после нажатия "Перейти к следующему вопросу" не записать ответ в сессию, куки, либо в базу данных / текстовый файл. А потом проверять: был ответ - новый не записываем, не было - записываем.

mrak1990
12-05-2007, 23:35
CouttyПочему бы после нажатия "Перейти к следующему вопросу" не записать ответ в сессию, куки, либо в базу данных / текстовый файл. А потом проверять: был ответ - новый не записываем, не было - записываем.
Всё это уже делается. Информация о номере вопроса, имя и фамилия и т.д. передаются через Cookie + пишется в БД.


PrisonerКстати, попробуйте использовать в формах метод GET
Это не катит, так как через тэг <hidden> передаётся кол-во полученных балов (правильность ответа проверяется сразу а не после прохождения всего теста).

Насчёт AJAX подумаю.

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

vadimiron
13-05-2007, 00:39
mrak1990
Лучше наверно в сессии хранить, а не в Сookie
Раз вы храните все данные, так в чём проблема? Если отвечается уже отвеченный вопрос, тогда ответ не принимается и сообщение "На этот вопрос Вы уже ответили" - и Пусть они себе шёлкают назад сколько влезит - только время теряют.

Coutty
13-05-2007, 08:37
mrak1990, есть сайт fepo.ru, где проводят интернет-экзамен (у нас проводили). Там окошко без тулбара разворачивается на весь экран, но назад всегда можно вернуться по бэкспэйсу.
Кроме того, если сразу показывать - правильный был ответ или нет, возможна групповая поддержка типа "а ты как ответил?" - "А вот так" - "И я так же отвечу". ИМХО лучше в конце теста всё сразу показать.
Но остаётся ещё проблема, что можно открыть новое окно с гуглом и, при наличии достаточного времени, поискать ответ там.
Дальше: а если этот hidden подменить? Было 10 правильных - стало 30. Модификация кода страницы (если не проверяется сервер, откуда идёт запрос) или что-нибудь типа ArtMoney с заменой значений в памяти (хотя насчёт этого я не уверен...).

mrak1990
13-05-2007, 17:55
CouttyДальше: а если этот hidden подменить? Было 10 правильных - стало 30. Модификация кода страницы (если не проверяется сервер, откуда идёт запрос) или что-нибудь типа ArtMoney с заменой значений в памяти (хотя насчёт этого я не уверен...).
К счастью, этот тест делается для школы. Я вообще-то сам пока учусь в 11 классе. И как-то раз меня попросили подготовить открытый урок со здачей тестов, ну я и написал за несколько дней всю систему. А теперь у меня просто есть желание довести до ума эту затею.
Насчёт Artmoney не думаю, что такое возможно. Ведь открытые страницы хранятся во временной папке. Я пробовал как-то изменить этот код - помойму ничего не произошло. Хотя я может быть и путаю.


есть сайт fepo.ru
Что-то он не открывается...


vadimironЕсли отвечается уже отвеченный вопрос, тогда ответ не принимается и сообщение "На этот вопрос Вы уже ответили"
Методов-то реализации проверки (была ли нажата кнопка назад) море. Проблема в том, что когда щелкаешь на кнопку назад, страница не обновляется. А для пролврки нужно в любом случае обновить страницу. Нужно как-то заставить браузер обновлять при переходе назад. Но как выше было сказано, с этим ничего не поделаешь. Ну я ещё конечно попробую на w3.org посмотреть. Может так есть какие-то приемы.

Coutty
13-05-2007, 19:11
Что-то он не открывается...
Блин, ну www.fepo.ru. Хотя я привёл так, для примера. Там всё равно без логин-пароля не посмотреть тесты.

Как ещё можно попробовать:
В основной html вставить ссылку на ява-скрипт с содержанием

document.write (" bla-bla-bla ");

А вместо этого "бла-бла-бла" написать свой код (как генерировать js из php, надеюсь, догадаться не трудно).

Я не могу сказать точно, но вроде как у меня такое не кэшировалось. Попробуй.

mrak1990
13-05-2007, 19:20
Coutty
Блин, ну www.fepo.ru.
Просто я привык, что сайты и без www открываются у меня. Но я забыл что так происходит не всегда...


В основной html вставить ссылку на ява-скрипт с содержанием

Код:

document.write (" bla-bla-bla ");
А вместо этого "бла-бла-бла" написать свой код (как генерировать js из php, надеюсь, догадаться не трудно).

Я не могу сказать точно, но вроде как у меня такое не кэшировалось. Попробуй.

Ты имеешь ввиду выводить всю форму со всеми её потрохами через document.write?

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

Coutty
13-05-2007, 20:54
Ты имеешь ввиду выводить всю форму со всеми её потрохами через document.write?
Да.

Т.е. такая последовательность (?):
Вызов скрипта php, который сгенерирует html-обложку (head, title и прочее). В нём создать строку...
<script language="javascript" src="scriptgen.php?number=10"> ... (не помню точно, как пишется) для вставки скрипта.
Соответственно, клиент, получив html, отправляет запрос на генерацию js, в котором уже будет основное содержимое.

В итоге у клиента будет собранная незакэшированная (незакэшированная ли?) страница. Чтобы получить новую страницу нужно будет опять отправлять запрос на создание html.

Таким образом, два скрипта:
1. Условно назовём htmlgen.php. Генерирует обложку, следит за изменением номера вопроса и обрабатывает ответ, полученный из формы.
2. scriptgen.php. Создаёт js с использованием запросов к базе данных или чего-там-ещё на основе числа из $_GET['number']. Обработкой результатов не занимается.

vadimiron
13-05-2007, 21:23
mrak1990
вдруг поможет (http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript)

Coutty
13-05-2007, 21:28
Можно ли этим способом вставлять строки в уже написаную страницу?
А вот тут мы подходим к AJAX. На вставке/замене данных с помощью скриптов всё и замешано =)

mrak1990
13-05-2007, 21:37
Будем думать. Долго, но упорно. Как всегда...

mrak1990
14-05-2007, 21:02
Будем думать. Долго, но упорно. Как всегда...
Я не угадал. Пришлось думать недолго. Поробовал я ради интереса поменять способ передачи данных в формах. Поставил GET, как предлагал Prisoner, и всё пошло как по маслу. Но в связи с этим возникает необходимость отказаться от передачи даных, содержащих кол-во полученых баллов, через тэг HIDDEN. Остаются сэссии. То есть нужно сделать так, чтобы при переходе назад откатывалась информация, содержащаяся в сэссии. Пока только получилось сделать так, чтобы при переходе назад информация из сэссии сбрасывалась в самое первое значение.
Для примера (этот код содержится в странице с названием 4.php):
<?php
session_start();
session_register("a");
$a=@$a+1;

echo $a;
?>

<form method=get action=4.php>
<input value='продолжить' type=submit></form>

Это код простейшего счетчика. Работает нормально. Но стоит не обновить страницу а нажать назад, как на экранее появляется единица. Значит сэссия уничтожается при переходе назад.
Так скрипт работает только в том случае, если отключить передачу SID через COOKIE.
Пробовал и другие комбинации параметров из php.ini, но ничего толкового не получилась.

mrak1990
14-05-2007, 22:20
Coutty
document.write (" bla-bla-bla ");

Совсем забыл сказать. Попробовал я выодить форму таким макаром. Толку ни какого. Всё абсолютно тоже самое.

mrak1990
01-06-2007, 13:01
Чего-то все молчат. Видно слишком глупые вопросы задаю. Ну на этот вопрос я думаю вы ответите. Можно ли последством JS или ка-то по другому удалять адреса из history?




© OSzone.net 2001-2012