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

是否存在可检测PDF加载完成的JavaScript事件?Chrome扩展开发场景下的实现问询

检测Chrome中PDF加载完成的解决方案

嘿,这个问题我之前做Chrome扩展时也踩过坑!Chrome内置的PDF阅读器用的是独立渲染层,普通的DOM加载事件(比如DOMContentLoaded、window.load)根本抓不到它的加载完成状态,jQuery的$(() => {})触发得太早也没用。给你几个亲测有效的方案:

方案一:用MutationObserver监听PDF阅读器元素

Chrome的PDF阅读器会生成一个id="viewer"的核心容器,里面的.page元素就是渲染好的PDF页面。我们可以用MutationObserver来监听这个容器的变化,一旦检测到页面元素被添加,就说明PDF已经加载并渲染完成了:

// 先等待PDF阅读器的核心容器出现
function waitForPDFViewer(callback) {
  const viewer = document.getElementById('viewer');
  if (viewer) {
    callback(viewer);
    return;
  }
  // 没找到就每隔100ms轮询一次
  setTimeout(() => waitForPDFViewer(callback), 100);
}

waitForPDFViewer((viewer) => {
  // 监听容器内的元素变化
  const observer = new MutationObserver((mutations) => {
    mutations.forEach((mutation) => {
      // 检查是否有新的页面元素被添加
      if (mutation.addedNodes.length > 0 && mutation.addedNodes[0].classList?.contains('page')) {
        console.log('PDF已加载并显示!');
        // 在这里执行你的content_script逻辑
        observer.disconnect(); // 不需要继续监听的话可以断开观察者
      }
    });
  });

  // 配置监听选项:监听子元素变化,包括子树
  observer.observe(viewer, { childList: true, subtree: true });
});

方案二:结合Chrome扩展的webNavigation API

如果你的扩展有webNavigation权限,可以在background脚本里监听PDF页面的加载完成事件,再通过消息通知content_script:

第一步:在manifest.json中添加权限

{
  "permissions": ["webNavigation", "<all_urls>"]
}

第二步:background.js中监听事件

chrome.webNavigation.onCompleted.addListener((details) => {
  // 只处理PDF文件
  if (details.url.endsWith('.pdf')) {
    // 给对应标签页的content_script发消息
    chrome.tabs.sendMessage(details.tabId, { action: 'pdfReady' });
  }
}, { url: [{ urlSuffix: '.pdf' }] });

第三步:content_script中接收消息

chrome.runtime.onMessage.addListener((message) => {
  if (message.action === 'pdfReady') {
    // 这里加个小延迟确保PDF渲染完成(因为onCompleted只是主资源下载完)
    setTimeout(() => {
      console.log('PDF加载渲染完成!');
      // 执行你的操作
    }, 500); // 延迟时间可根据实际情况调整
  }
});

方案三:简单轮询PDF页面元素

如果不想用复杂的API,也可以用定时轮询的方式检查PDF页面是否存在:

function checkPDFLoaded() {
  const pdfPages = document.querySelectorAll('.page');
  if (pdfPages.length > 0) {
    console.log('PDF已加载完成!');
    // 执行你的content_script逻辑
  } else {
    // 每隔200ms检查一次
    setTimeout(checkPDFLoaded, 200);
  }
}

// 主页面加载后开始轮询
window.addEventListener('load', checkPDFLoaded);

为什么普通事件没用?

Chrome内置的PDF阅读器并非普通的网页DOM元素,它是Chrome内置的组件,其渲染流程独立于主页面的DOM加载流程。所以DOMContentLoaded和window.load触发时,PDF可能还在后台下载或渲染,自然抓不到它的完成状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:22:29