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

如何使用JavaScript禁用Chrome标签页丢弃功能并实现持久化?

一、禁用标签页丢弃并实现持久生效的方案

1. 浏览器扩展方案(唯一支持持久生效的方式)

只有Chrome扩展能调用浏览器核心API并持久化配置,完全匹配你的需求:

步骤1:搭建扩展基础结构

新建一个文件夹,放入两个核心文件:

  • manifest.json:声明扩展权限与基础信息,采用Chrome主推的V3版本:
    {
      "manifest_version": 3,
      "name": "阻止标签自动丢弃",
      "version": "1.0",
      "permissions": ["tabs", "storage"],
      "background": {
        "service_worker": "background.js"
      }
    }
    
  • background.js:实现核心控制逻辑的后台脚本。

步骤2:编写核心控制逻辑

在background.js中完成两个核心动作:存储需要保护的页面规则,自动给符合规则的标签设置不可丢弃属性:

// 从本地存储获取需要保护的域名列表
async function getProtectedDomains() {
  const result = await chrome.storage.local.get('protectedDomains');
  return result.protectedDomains || [];
}

// 将指定标签设置为不可丢弃
async function lockTabAgainstDiscard(tabId) {
  try {
    await chrome.tabs.setDiscardable(tabId, false);
    console.log(`标签 ${tabId} 已锁定,不会被自动丢弃`);
  } catch (err) {
    console.error(`锁定标签失败: ${err}`);
  }
}

// 监听标签加载完成事件,自动锁定符合规则的标签
chrome.tabs.onCompleted.addListener(async (tab) => {
  const domains = await getProtectedDomains();
  const tabDomain = new URL(tab.url).hostname;
  if (domains.includes(tabDomain)) {
    await lockTabAgainstDiscard(tab.id);
  }
});

// 浏览器启动时,重新锁定所有符合规则的标签
chrome.runtime.onStartup.addListener(async () => {
  const domains = await getProtectedDomains();
  const tabs = await chrome.tabs.query({});
  for (const tab of tabs) {
    const tabDomain = new URL(tab.url).hostname;
    if (domains.includes(tabDomain)) {
      await lockTabAgainstDiscard(tab.id);
    }
  }
});

// 提供添加保护域名的接口(可配合popup页面扩展功能)
chrome.runtime.onMessage.addListener(async (message, _, sendResponse) => {
  if (message.action === 'addDomain') {
    let domains = await getProtectedDomains();
    if (!domains.includes(message.domain)) {
      domains.push(message.domain);
      await chrome.storage.local.set({ protectedDomains: domains });
      sendResponse({ success: true });
    } else {
      sendResponse({ success: false, msg: '该域名已在保护列表中' });
    }
  }
});

步骤3:安装与测试

打开Chrome扩展管理页面(chrome://extensions/),开启开发者模式,点击「加载已解压的扩展程序」,选中你的扩展文件夹即可。添加的保护域名会存在本地存储中,重启浏览器也不会丢失。

2. 页面内临时方案(仅当前会话有效)

不想开发扩展的话,只能实现临时阻止效果,关闭页面或浏览器后设置失效:

  • 使用navigator.locks.request()请求永久锁,让浏览器认为页面在执行重要操作,暂时不触发丢弃:
    // 请求独占锁,直到页面关闭才释放
    navigator.locks.request('prevent-tab-discard', { mode: 'exclusive' }, async () => {
      // 用永久Promise挂住锁
      await new Promise(() => {});
    });
    
  • 或在页面切换到后台时定时发送空请求,模拟页面活跃状态,但这种方法可靠性低,资源紧张时Chrome仍可能丢弃标签。
二、关于访问chrome://discards页面的问题

chrome://discards是Chrome的内部特权页面,任何JavaScript都无法直接访问或操作它:

  • 普通网页的JS会被同源策略直接拦截,无法加载该页面,也不能通过iframe嵌入。
  • 扩展的内容脚本也禁止注入到chrome://开头的页面,Chrome不允许扩展操作内部特权页面。
  • 若要获取标签的丢弃状态,直接使用Chrome扩展API即可:比如chrome.tabs.query({})返回的标签对象包含discardable字段,或调用chrome.tabs.getDiscardable()查询单个标签的丢弃属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:54:17