#javascript #jquery #browser
#javascript #jquery #браузер
Вопрос:
Я разрабатываю приложение для онлайн-тестирования, и требуется, чтобы во время теста пользователям не разрешалось обновлять страницу и не возвращаться назад, пока тест не будет завершен. Я успешно смог отключить действие обновления в jquery всеми возможными способами (насколько мне известно), используя следующий код:
$(window).bind({
beforeunload: function(ev) {
ev.preventDefault();
},
unload: function(ev) {
ev.preventDefault();
}
});
Но у меня возникли проблемы с отключением обратного действия во всех браузерах, лучшее решение, которое я нашел, противоречит приведенному выше коду, он приведен ниже:
window.onload = function () {
if (typeof history.pushState === "function") {
history.pushState("jibberish", null, null);
//alert("Reloaded");
window.onpopstate = function () {
history.pushState('newjibberish', null, null);
// Handle the back (or forward) buttons here
// Will NOT handle refresh, use onbeforeunload forthis.
};
}
else {
var ignoreHashChange = true;
window.onhashchange = function () {
if (!ignoreHashChange) {
ignoreHashChange = true;
window.location.hash = Math.random();
// Detect and redirect change here
// Works in older FF and IE9
// * it does mess with your hash symbol (anchor?) pound sign
// delimiter on the end of the URL
}
else {
ignoreHashChange = false;
}
};
}
}
Приведенное выше решение соответствует моей цели отключения кнопки возврата, но конфликтует с обработчиком предотвращения обновления страницы выше.
У меня нет идей о том, что делать, и я также долго искал решение этой проблемы, но пока ничего не нашел. Любая помощь была бы очень признательна, даже если для решения проблемы потребуется совершенно другой подход, я бы совсем не возражал.
Спасибо всем
Обновить
Я никогда не понимал, что такое поведение нарушает множество этических правил, во всяком случае, я подумал об этом и придумал, что еще можно сделать, когда страница обновляется или нажата кнопка «Назад» (либо с помощью клавиатуры, либо с помощью элементов управления браузером). Я хочу перенаправить на URL-адрес, который завершит текущую экзаменационную сессию. Я считаю, что это возможно, поэтому я думаю, что решение, которое я ищу, — найти наилучший способ добиться этого. Перенаправление на другой URL-адрес при нажатии кнопки возврата или обновления (как с помощью элементов управления браузером, так и с клавиатуры).
Комментарии:
1. С тех пор, когда предотвращение события beforeunload или unload отключает обновление страницы??? Я что-то здесь пропустил ?!
2. Вы не можете запретить пользователю перенаправлять, возвращаться или обновлять страницу, это будет раздражать пользователей и вызывать проблемы, если браузеры разрешат это.
3. @A.Wolff, я не могу точно сказать, как и почему это работает, я нашел это на SO и попробовал, тогда это работает, однако мне нравится развиваться, придерживаясь лучших практик, поэтому указание мне на правильную вещь будет очень полезно.
4. @adeneo как я уже упоминал в своем вопросе, это требование для теста во время сеанса, так что на самом деле это не касается пользовательского опыта / удобства
5. Дело в том, что код, который у вас есть, вообще не должен работать. Вы не можете предотвратить события выгрузки, поскольку это позволило бы вредоносным сайтам просто заблокировать вас на своей странице. Речь идет не только о пользовательском опыте, но и о том, что пользователи могут уйти, когда им захочется.
Ответ №1:
Я перепробовал много вариантов, но ни один из них не работал, кроме этого-
//Diable Browser back in all Browsers
if (history.pushState != undefined) {
history.pushState(null, null, location.href);
}
history.back();
history.forward();
window.onpopstate = function () {
history.go(1);
};
Комментарии:
1. Наконец, что-то, что работает отлично, спасибо!!
Ответ №2:
Что касается обновления, которое я опубликовал в своем вопросе, я смог решить свою проблему. Вот что я сделал (просто немного изменив существующий код и удалив прослушиватель window.onload, который у меня был изначально):
$(window).bind({
beforeunload: function(ev) {
window.location.replace("my_url_goes_in_here");
},
unload: function(ev) {
window.location.replace("my_url_goes_in_here");
}
});
Эта конструкция работает как для обновления страницы, так и для действий возврата, выполняемых в любом случае (либо с помощью клавиатуры, либо с помощью элементов управления браузером для любого из них).
Тем не менее, я еще не тестировал ни в одном другом браузере, кроме firefox 47.0, но я рад, что он все равно работает. Спасибо за все ваши комментарии, они были чрезвычайно полезны
Ответ №3:
Использование javascript если у вас есть две страницы page1 и page2 и (перенаправление страницы 1 на страницу 2) и вы хотите запретить пользователю возвращаться на страницу 1, просто поместите этот код на страницу 1.
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$(document).ready(function () {
function disableBack() {
window.history.forward()
}
window.onload = disableBack();
window.onpageshow = function (evt) {
if (evt.persisted)
disableBack()
}
});
</script>