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

Chrome扩展修改PDF页面标题,PDF加载完成后标题被还原无法修改

问题根本原因

Chrome 内置的 PDF 阅读器会在 PDF 资源完全解析完成后,主动将页面标题重置为 PDF 内置标题或文件名,你之前设置的多个定时任务执行时机大概率在 PDF 阅读器的标题重写逻辑之前,所以修改完成后会被自动覆盖。
手动在控制台执行修改时 PDF 已经完成加载,不会再触发自动重写逻辑,因此可以生效。

解决方案

完全不需要依赖固定时长的定时任务,使用 MutationObserver 监听页面 title 节点的变化,只要标题被修改为非预期值就自动改回,从根源避免被覆盖:

步骤1:调整 manifest 配置(如果之前没配置对)

确保你的 manifest 中 content script 匹配规则覆盖 PDF 页面,且执行时机足够早,以 Manifest V2 为例:

{
  "content_scripts": [
    {
      "matches": ["*://*/*.pdf"],
      "js": ["content_script.js"],
      "run_at": "document_start"
    }
  ],
  "permissions": ["tabs"]
}

如果是 Manifest V3,对应调整 manifest_version、permissions 字段即可。

步骤2:替换 content_script.js 逻辑

// 自定义目标标题,可替换为你自己的动态生成逻辑
const CUSTOM_TITLE = "cool title";
// 防抖标记,避免自身修改title触发监听循环
let isSelfUpdating = false;

const initTitleLock = () => {
  const titleElement = document.querySelector("title");
  if (!titleElement) return;

  // 监听title节点内容变化
  const titleObserver = new MutationObserver(() => {
    if (isSelfUpdating || document.title === CUSTOM_TITLE) return;
    isSelfUpdating = true;
    document.title = CUSTOM_TITLE;
    // 50ms后重置防抖标记
    setTimeout(() => isSelfUpdating = false, 50);
  });

  titleObserver.observe(titleElement, { childList: true });
  // 初始化先执行一次修改
  document.title = CUSTOM_TITLE;
};

// 兼容不同页面加载状态
if (document.readyState === "loading") {
  document.addEventListener("DOMContentLoaded", initTitleLock);
} else {
  initTitleLock();
}

// 可选:监听PDF embed元素加载完成,用于执行动态标题提取逻辑
const pdfEmbed = document.querySelector('embed[type="application/pdf"]');
if (pdfEmbed) {
  pdfEmbed.addEventListener("load", () => {
    // 这里可以加你的自定义标题生成逻辑,比如从页面内容爬取PDF标题
    // 生成后直接赋值给document.title即可,监听逻辑会自动锁定
  });
}

步骤3:清理冗余逻辑

原 background.js 中的消息监听和执行逻辑可以完全删除,不需要跨上下文传递修改标题的请求,所有逻辑在 content script 中即可完成。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:09:02