Отключить обратное действие браузера с помощью jquery

#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>