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
相关产品推荐
相关产品推荐

