判断当前界面是否是通过用户点击浏览器后退按钮加载的

判断当前界面是否是通过用户点击浏览器后退按钮加载的,主要依赖于浏览器提供的API和事件。目前主要有以下几种方式:

1. 使用 performance.navigation.type (推荐,较准确)

这是相对最可靠和直接的方式。performance.navigation 对象提供了关于页面如何导航的信息,其中 type 属性可以指示导航的类型。

  • 0 (TYPE_NAVIGATE): 用户通过点击链接、输入地址、书签等方式导航到该页面。
  • 1 (TYPE_RELOAD): 用户通过点击刷新按钮或使用 F5 键刷新页面。
  • 2 (TYPE_BACK_FORWARD): 用户通过点击浏览器的前进或后退按钮导航到该页面。
  • 255 (TYPE_RESERVED): 其他类型。

HTML 代码示例:

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <title>判断后退加载</title>
</head>
<body>
  <h1>当前页面</h1>
  <p id="navigationType"></p>

  <script>
    const navigationTypeElement = document.getElementById('navigationType');
    const navigationType = performance.navigation.type;

    if (navigationType === PerformanceNavigation.TYPE_BACK_FORWARD) {
      navigationTypeElement.textContent = '页面通过浏览器后退/前进按钮加载。';
      console.log('页面通过浏览器后退/前进按钮加载。');
      // 执行后退加载时的特定操作
    } else if (navigationType === PerformanceNavigation.TYPE_RELOAD) {
      navigationTypeElement.textContent = '页面通过刷新加载。';
      console.log('页面通过刷新加载。');
    } else if (navigationType === PerformanceNavigation.TYPE_NAVIGATE) {
      navigationTypeElement.textContent = '页面通过正常导航加载。';
      console.log('页面通过正常导航加载。');
    } else {
      navigationTypeElement.textContent = '未知加载方式。';
      console.log('未知加载方式。');
    }
  </script>
</body>
</html>

注意事项:

  • PerformanceNavigation 对象及其常量 (例如 PerformanceNavigation.TYPE_BACK_FORWARD) 在较新版本的浏览器中支持良好。
  • 如果你的目标浏览器需要兼容较老的版本,可能需要检查 performance.navigation 是否存在。

2. 使用 pageshow 事件和 event.persisted 属性

pageshow 事件在页面显示时触发,包括初次加载和从浏览器缓存中加载(例如通过后退/前进按钮)。 event.persisted 属性指示页面是否是从浏览器的持久化缓存中加载的。

HTML 代码示例:

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <title>判断后退加载</title>
</head>
<body>
  <h1>当前页面</h1>
  <p id="pageshowInfo"></p>

  <script>
    const pageshowInfoElement = document.getElementById('pageshowInfo');

    window.addEventListener('pageshow', function(event) {
      if (event.persisted) {
        pageshowInfoElement.textContent = '页面通过浏览器后退/前进按钮从缓存加载。';
        console.log('页面通过浏览器后退/前进按钮从缓存加载。');
        // 执行后退加载时的特定操作
      } else {
        pageshowInfoElement.textContent = '页面首次加载或刷新加载。';
        console.log('页面首次加载或刷新加载。');
      }
    });
  </script>
</body>
</html>

注意事项:

  • pageshow 事件会在页面首次加载时也会触发,但此时 event.persistedfalse
  • 这种方式依赖于浏览器的缓存机制,因此只有当页面是从缓存中加载时才能判断为后退加载。

3. 结合 sessionStoragelocalStorage (间接方式)

这种方式不是直接判断,而是通过在离开页面时设置一个标记,然后在返回时检查这个标记是否存在。

步骤:

  1. 在离开前一个页面时设置标记: 在前一个页面的 unloadbeforeunload 事件中设置 sessionStoragelocalStorage 的一个键值。
  2. 在当前页面加载时检查标记: 在当前页面的加载时检查该标记是否存在。

HTML 代码示例 (结合 sessionStorage):

前一个页面 (previous.html):

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <title>前一个页面</title>
</head>
<body>
  <h1>前一个页面</h1>
  <a href="current.html">去往当前页面</a>

  <script>
    window.addEventListener('beforeunload', function() {
      sessionStorage.setItem('isBackNavigation', 'true');
    });
  </script>
</body>
</html>

当前页面 (current.html):

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <title>判断后退加载</title>
</head>
<body>
  <h1>当前页面</h1>
  <p id="storageInfo"></p>

  <script>
    const storageInfoElement = document.getElementById('storageInfo');
    if (sessionStorage.getItem('isBackNavigation')) {
      storageInfoElement.textContent = '页面可能是通过浏览器后退按钮加载。';
      console.log('页面可能是通过浏览器后退按钮加载。');
      sessionStorage.removeItem('isBackNavigation'); // 清除标记
      // 执行后退加载时的特定操作
    } else {
      storageInfoElement.textContent = '页面可能是正常加载。';
      console.log('页面可能是正常加载。');
    }
  </script>
</body>
</html>

注意事项:

  • 这种方式的可靠性取决于 unloadbeforeunload 事件是否能正常触发。在某些情况下,特别是用户直接关闭标签页或浏览器时,这些事件可能不会触发。
  • 需要修改前一个页面的代码,这可能不是总是可行的。
  • 这种方式更像是判断用户是否"刚刚"从某个特定的页面返回,而不是严格意义上的浏览器后退按钮。

4. document.referrer (不太可靠)

document.referrer 属性返回的是用户导航到当前页面之前所在的页面的 URL。理论上,如果通过后退按钮加载,document.referrer 应该存在。

HTML 代码示例:

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <title>判断后退加载</title>
</head>
<body>
  <h1>当前页面</h1>
  <p id="referrerInfo"></p>

  <script>
    const referrerInfoElement = document.getElementById('referrerInfo');
    if (document.referrer) {
      referrerInfoElement.textContent = `referrer: ${document.referrer}`;
      console.log(`referrer: ${document.referrer}`);
      // 可能是后退加载,但不能完全确定
    } else {
      referrerInfoElement.textContent = '没有 referrer 信息。';
      console.log('没有 referrer 信息。');
      // 可能是首次加载、刷新、或用户直接输入地址
    }
  </script>
</body>
</html>

注意事项:

  • 非常不可靠。 document.referrer 在很多情况下为空:
    • 用户直接在地址栏输入 URL。
    • 用户点击了书签。
    • 通过某些 <a> 标签的 rel="noreferrer" 属性导航。
    • 从 HTTPS 页面导航到 HTTP 页面(出于安全原因,referrer 会被移除)。
  • 即使 document.referrer 存在,也不能完全确定是后退加载,因为用户也可以从其他页面点击链接返回。

总结和选择建议:

  • 最推荐:performance.navigation.type 这是最准确和直接的方式来判断是否是通过后退/前进按钮加载的。
  • 备选方案:pageshow 事件和 event.persisted 如果需要处理从缓存加载的情况,可以使用这种方式。
  • 间接方式:结合 sessionStoragelocalStorage 适用于需要跟踪用户是否从特定页面返回的场景。
  • 不推荐用于判断后退:document.referrer 由于其不可靠性,不适合用来判断是否是后退加载。

在实际应用中,可以根据具体的需求和目标浏览器的兼容性来选择合适的方法。通常,使用 performance.navigation.type 是最简洁和有效的方式。如果需要更精细的控制,或者需要兼容旧浏览器,可以考虑结合使用多种方法。

相关推荐
崔庆才丨静觅10 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606111 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了11 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅11 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅12 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅12 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment12 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅12 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊13 小时前
jwt介绍
前端
爱敲代码的小鱼13 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax