You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Chrome与Firefox下实现点击链接新标签打开且焦点保留在当前标签

嗨,我之前也碰到过这个超头疼的问题!现在浏览器对窗口焦点的管控越来越严格,直接用window.open后强制focus()/blur()基本没用——很多浏览器会判定这种行为是恶意弹窗拦截,根本不生效。不过我折腾了半天,找到了一个能兼容Chrome和Firefox的靠谱方案,亲测有效:

核心思路

先打开一个空白的新标签页,立刻把焦点切回当前页面,最后再让空白标签页加载目标URL。这样浏览器不会把焦点抢走,因为实际内容加载是在焦点已经回到当前页之后发生的。

实现代码(原生JS,无需jQuery)

// 给所有需要这个行为的a标签加个类,比如"keep-focus"
document.querySelectorAll('a.keep-focus').forEach(link => {
  link.addEventListener('click', function(e) {
    e.preventDefault(); // 阻止默认跳转行为
    const targetUrl = this.href;

    // 1. 打开空白新标签页
    const newTab = window.open('', '_blank');
    if (!newTab) {
      // 处理浏览器弹窗拦截的情况
      alert('请允许弹窗权限以打开新标签页');
      return;
    }

    // 2. 强制焦点回到当前页面
    window.focus();

    // 3. 延迟给新标签页设置URL(确保焦点切换生效)
    setTimeout(() => {
      newTab.location.href = targetUrl;
    }, 80); // 80-100ms的延迟足够兼容大部分浏览器
  });
});

为什么这个方法能行?

  • window.open('', '_blank')只是打开一个空白页,浏览器不会立刻把焦点转移过去(就算短暂转移,我们马上用window.focus()切回来了)
  • 等焦点稳定在当前页后再加载目标URL,新标签页会在后台默默加载,不会抢夺焦点
  • 延迟时间不用太长,80ms足够让浏览器完成焦点切换,用户完全感知不到

兼容性说明

亲测在**Chrome 100+Firefox 95+**的默认设置下都能正常工作。如果用户浏览器设置了“强制在新窗口打开所有链接”,可能会有例外,但这种情况属于极少数。

注意事项

  • 不要滥用这个功能!毕竟很多用户点击新标签页就是想跳过去看内容,只在明确需要保留当前页焦点的场景下使用
  • 记得处理弹窗拦截的情况(代码里已经加了判断),避免用户操作无反馈

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

火山引擎 最新活动