模拟浏览器后退事件

在工作中碰到一个需求:点击浏览器的后退按钮时,需要判断当前页面的表单数据是否已保存;如果没保存,就给出提示。但浏览器并没有后退事件,这个项目也没有用什么 MV** 之类的框架或库,用的是 jQuery,于是只能尝试模拟浏览器后退事件。

用的是 H5 中的 pushState 与 popstate,代码如下:

var onBrowserBack = function(callback) {
  var userAgent = navigator.userAgent.toLowerCase(),
      isSafari = userAgent.indexOf(‘safari‘) > -1 && userAgent.indexOf(‘chrome‘) < 1,
      referrer = document.referrer;

  if (window.history && window.history.pushState) {
    if (isSafari) {
      window.onload = function() {
        window.isLoaded = ‘isLoaded‘;
      };
    }

    history.pushState(‘historyPushState‘, null, null);

    window.onpopstate = function(event) {
      history.pushState(null, null, null);

      if (window.isLoaded === ‘isLoaded‘) {
        window.isLoaded = ‘‘;
      } else {
        if (history.state === ‘historyPushState‘) {
          history.forward(); // 自动“前进”一步,否则“前进”按钮可点击
        } else {
          if (typeof callback === ‘function‘ && callback(event) !== false) {
            window.location.href = referrer;
          }
        }
      }
    };
  }
};

popstate 事件会在用户点击浏览器(Chrome, Firefox, Safari)的“前进”和“后退”按钮时触发,但在 Safari 中还多一种触发的情况 ── load 页面时也会触发,例如由其它页面跳转过来,以及刷新。因此,需要在 Safari 中排除这种情况,代码里用的是浏览器的用户代理来检测 Safari。

调用:

onBrowserBack(function() {
  console.log(‘popstate‘);

  // 自定义跳转到其它链接
  window.location.href = ‘https://www.baidu.com‘;
  return false;
});

如果要跳转到其它页面,需要用 js 手动跳转。

这种模拟方式的问题在于,没法点击“前进”按钮;并且,“后退”按钮只能回退到前一步,如果再点,就又回到了当前页面(使用了 onBrowserBack 的页面)。

时间: 2024-08-05 19:28:37

模拟浏览器后退事件的相关文章

监听浏览器后退事件,使其转向指定URL

$(function(){ //清空浏览器历史记录 pushHistory(); //监听浏览器后退事件 window.addEventListener("popstate", function(e) { //转向指定的URL location.href=url; }, false); //清空浏览器历史记录 function pushHistory() { var url = "#"; var state = { title: "title",

根据浏览器history模拟浏览器后退按钮显隐问题

场景:在APP页面开发中,有一个需求,做一个返回按钮,实现的功能和浏览器的后退按钮相同. 措施:具体思路如下: 1.开始打开页面时,浏览器的history.length为1,按钮隐藏:     2.当history.length>1时,点击按钮执行 history.go(-1): 3.后退到历史记录栈中第一帧时,按钮隐藏.出于浏览器安全性考虑,history中没有给出属性判断其当前页的位置,所以,在开始打开页面,处于第一帧时,在当前url中添加参数,按钮点击事件触发时,根据该参数可判断是否是第一

浏览器后退事件的方法

当页面已经填了内容,点击浏览器返回按钮,弹出确认框,是否退出?如果填写内容为空,则直接退出 注:以下是写在vue的methods里的代码 window.addEventListener('popstate', function () { if (self.isEmpty) { window.location.href = `http://www.baidu.com`; } else { if (bool) { window.history.pushState('forward', null, '

js监听浏览器后退事件

$(document).ready(function(e) {             var counter = 0;            if (window.history && window.history.pushState) {                             $(window).on('popstate', function () {                                            window.history.

js 捕获浏览器后退事件

$(document).ready(function(e) {             var counter = 0;             if (window.history && window.history.pushState) {             window.onpopstate = function () {                         window.history.pushState('forward', null, '#');      

浏览器后退出现ajax不显示

由于左边侧边栏是ajax实现 浏览器进行后退时出现ajax不显示的问题 利用js实现判断,当实现浏览器后退事件时进行页面的刷新 $(document).ready(function(){if(window.performance&&window.performance.navigation.type == 2) { location.replace(document.referrer); } }) 原文地址:https://www.cnblogs.com/cmz-32000/p/11683

浏览器后退(返回)事件捕获

有时候碰到用户喜欢点浏览器后退(返回上一页)按钮,有时候会报错,或者数据不刷新,我们可以捕获它自定义做些事情 拿好不谢 1 window.onload = function () { 2 if (typeof history.pushState === "function") { 3 history.pushState("jibberish", null, null); 4 window.onpopstate = function () { 5 history.pu

防止页面后退(使浏览器后退按钮失效)

防止页面后退(使浏览器后退按钮失效) 原理:用新页面的URL替换当前的历史纪录,这样浏览历史记录中就只有一个页面,后退按钮永远失效. 注:history.go和history.back(包括用户按浏览器历史前进后退按钮)触发, 页面由于使用pushState修改了history),会触发popstate事件.     [代码如下]       注:直接放在不想后退跳转的页面即可! 方法一:       <script type="text/javascript">     

由chrome剪贴板问题研究到了js模拟鼠标键盘事件

写在前面 最近公司在搞浏览器兼容的事情,所有浏览器兼容的问题不得不一个人包了.下面来说一下今天遇到的一个问题吧 大家都知道IE下面如果要获得剪贴板里面的信息的话,代码应该如下所示 window.clipboardData.getData("Text") 可是在chrome下面就行不通了,chrome下面没有类似ie的这种方法,那应该怎么办呢,百度了一下,发现还真有办法. 只要在HTML界面上放上一个text类型的控件,如下所示 <textarea id="textAre