Events Chrome扩展:何时读取标签(<;头>;

Events Chrome扩展:何时读取标签(<;头>;,events,google-chrome-extension,html-head,Events,Google Chrome Extension,Html Head,我正在编写一个GoogleChrome扩展,其中我解析任何加载页面的标记,并查找特定的标记。内容脚本用于与站点通信,然后在后台脚本中完成实际逻辑 问题是背景脚本何时应该要求内容脚本检查标记chrome.webNavigation.onDOMContentLoaded似乎是安全的,但我发现在加载页面时,此事件通常会被多次触发。另外,可能在chrome.webNavigation.onDOMContentLoaded点击之前可用。这就引出了一个问题: 如何最好地检查页面的部分何时加载?因为您正在向所

我正在编写一个GoogleChrome扩展,其中我解析任何加载页面的
标记,并查找特定的
标记。内容脚本用于与站点通信,然后在后台脚本中完成实际逻辑

问题是背景脚本何时应该要求内容脚本检查
标记
chrome.webNavigation.onDOMContentLoaded
似乎是安全的,但我发现在加载页面时,此事件通常会被多次触发。另外,
可能在
chrome.webNavigation.onDOMContentLoaded
点击之前可用。这就引出了一个问题:


如何最好地检查页面的
部分何时加载?

因为您正在向所有页面中注入内容脚本,所以任务可以在其中完成,而不是总是等待页面完全加载(可能需要很长时间,具体取决于连接速度和其他因素)

在文档加载开始时注入内容脚本,并使用attached to
document.head
在页面加载过程中插入DOM时立即获得结果。观察者将只观察
HEAD
元素的直接子元素,这样就不会影响性能

一些站点可能会在页面加载后添加
meta
元素-这将被观察者捕获

  • manifest.json:

    “内容脚本”:[{
    “匹配项”:[“”],
    “js”:[“content.js”],
    “运行时间”:“文档开始”
    }],
    
  • content.js:

    如果存在
    HEAD
    ,则查找所需的
    meta
    元素,否则等待插入
    HEAD

    if(document.head){
    主考人();
    }否则{
    新的突变观察者(功能(突变){
    if(文件头){
    这个.disconnect();
    主考人();
    }
    }).observe(document.documentElement,{childList:true});
    }
    职能考官(){
    var节点=document.head.getElementsByTagName('meta');
    对于(var i=0;i
    观察
    文档。标题
    并检查每个新元素是否为一个

    函数observeHead(){
    新的突变观察者(功能(突变){
    对于(var i=0;i<0.length;i++){
    变量节点=突变[i]。添加节点;
    对于(var j=0;j
    例如,让我们查找
    ,并向后台脚本发送一条值为
    content
    属性的消息

    函数reportMetaNode(n){
    console.log(n,n.outerHTML);
    如果(n.name==“twitter:app:id:googleplay”){
    chrome.runtime.sendMessage({gotMeta:n.content});
    返回true;
    }
    返回false;
    }
    
    您可能还希望处理其他类型的突变,如
    characterData
    attributes
    ,因为某些站点可能会在单独的步骤中更改或添加元素(createElement、setAttribute、附加子文本节点等),在这种情况下,观察者回调将更加复杂,在
    observe()
    参数中需要
    subtree:true


onDOMContentLoaded
每帧只能触发一次。如果您只对顶层框架感兴趣,请检查
details.frameId===0
。如果它在每次页面加载时被触发不止一次,那么它就是一个bug。