代码之家  ›  专栏  ›  技术社区  ›  CanisLupus

如何在页面的所有框架加载时执行脚本(即不使用document\u idle)

  •  0
  • CanisLupus  · 技术社区  · 7 年前

    我的WebExtension(本例中是Firefox)通过在页面上执行脚本来修改页面。我需要脚本来处理页面及其所有框架,并且我需要在创建页面/框架时(即页面中的内容仍在加载时)尽快执行脚本。

    我看到有两种选择,但都无法实现这一点:

    1. 呼叫 browser.tabs.executeScript() 将脚本注入 runAt: "document_start" allFrames: false . 在执行的内容脚本本身上,尝试修改窗口的所有帧。由于跨域策略,对于内容来自另一个域的帧,这是不可能的。

    2. 呼叫 浏览器选项卡。executeScript() 具有 allFrames: true . 脚本将被注入到所有帧中,但如果加载一个帧需要更长的时间,则使用 runAt:“document\u start” 将仅在主文档而不是框架上执行。使用 "document_idle" 工作正常,但工作时间长。

    我也试过打电话 executeScript 具有 runAt:“document\u start” 所有帧:false ,然后是另一个呼叫 runAt: "document_idle" 所有帧:true . 这将是一个中间地带,允许主文档立即工作(大多数页面),但会稍微延迟帧。但是,执行的脚本将在主页中注入两次并导致错误。

    这些都不允许我在加载时在所有帧上执行脚本。我该怎么做?

    我怀疑需要一个更麻烦的解决方案,如果您有想法,我将不胜感激。谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Matt    7 年前

    您可以对注入脚本进行更细粒度的控制。我有一个带a的分机 webNavigation.onCompleted 当页面完全加载时激发的侦听器。

    browser.webNavigation.onCompleted.addListener(function(details){
      // don't inject into the main frame (id = 0)
      if(details.frameId != 0) {
        chrome.tabs.executeScript(details.tabId, {file: "js/contentScript.js", frameId: details.frameId});
      }
    });
    

    这需要 webNavigation 清单中的权限。json

    也许你的第一个脚本在 document_start .