You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用history.back()前如何检查目标URL?需拦截外部页面跳转

实现返回按钮跳转外部页面时自动禁用

核心限制说明

浏览器出于安全策略,无法直接读取history栈中的上一页URL,所以我们通过document.referrer(当前页面的来源URL)来判断上一页是否属于同域,以此决定是否允许返回。

实现代码

1. 域名提取工具函数

先写一个通用函数,用来从URL中提取域名:

function getDomain(url) {
  const link = document.createElement('a');
  link.href = url;
  return link.hostname;
}

2. 完整页面示例

<button id="backButton">返回上一页</button>

<script>
function getDomain(url) {
  const link = document.createElement('a');
  link.href = url;
  return link.hostname;
}

const backButton = document.getElementById('backButton');
const currentDomain = getDomain(window.location.href);
const referrerDomain = getDomain(document.referrer);

// 判断是否允许返回:存在来源URL且域名与当前页面一致
const allowBack = document.referrer && currentDomain === referrerDomain;

// 设置按钮状态
backButton.disabled = !allowBack;

// 绑定点击事件
backButton.addEventListener('click', () => {
  if (allowBack) {
    history.back();
  }
});
</script>

额外说明

  • 如果用户是直接输入URL、通过书签打开当前页面,document.referrer为空,按钮会被禁用;
  • 若需要将子域名(如blog.example.com)与主域名(example.com)视为同域,可修改getDomain函数,通过正则提取主域名:
    function getMainDomain(url) {
      const link = document.createElement('a');
      link.href = url;
      // 匹配主域名(适用于多数常见域名格式)
      return link.hostname.match(/\w+\.\w+$/)?.[0] || link.hostname;
    }
    
  • 隐私模式下部分浏览器会隐藏document.referrer,此时按钮同样会被禁用。

内容的提问来源于stack exchange,提问作者Homo Civicus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:52:13