如何在页面的所有框架加载时执行脚本(即不使用 document_idle)
How to executeScript on all frames of a page as they load (i.e. not using document_idle)
我的 WebExtension(在本例中为 Firefox)通过在页面上执行脚本来修改页面。我需要脚本在页面及其所有框架上运行,并且我需要它在创建 page/frame 时尽快发生(即当页面中的内容仍在加载时)。
我看到有两个选项,都无法实现:
调用 browser.tabs.executeScript()
以使用 runAt: "document_start"
和 allFrames: false
注入脚本。在执行的内容脚本本身上,尝试修改 window 的所有帧。由于跨域策略,这对于内容来自另一个域的框架是不可能的。
用 allFrames: true
调用 browser.tabs.executeScript()
。该脚本将被注入到所有框架中,但如果一个框架需要更长的时间来加载,使用 runAt: "document_start"
将只在主文档而不是框架上执行。使用 "document_idle"
效果很好,但需要很长时间。
我也试过用 runAt: "document_start"
和 allFrames: false
调用 executeScript
,然后用 runAt: "document_idle"
和 allFrames: true
调用另一个。这将是中间立场,让主文档立即工作(大多数页面)但稍微延迟帧。但是,执行的脚本会在主页中被注入两次并导致错误。
其中 None 让我在所有帧加载时执行脚本。我该怎么做?
我怀疑需要一个更麻烦的解决方案,如果您有想法,我将不胜感激。谢谢!
您可以更精细地控制脚本的注入。我有一个带有 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});
}
});
这需要 manifests.json
中的 webNavigation
权限
也许这可以与您在 document_start
处注入主框架的第一个脚本一起使用。
我的 WebExtension(在本例中为 Firefox)通过在页面上执行脚本来修改页面。我需要脚本在页面及其所有框架上运行,并且我需要它在创建 page/frame 时尽快发生(即当页面中的内容仍在加载时)。
我看到有两个选项,都无法实现:
调用
browser.tabs.executeScript()
以使用runAt: "document_start"
和allFrames: false
注入脚本。在执行的内容脚本本身上,尝试修改 window 的所有帧。由于跨域策略,这对于内容来自另一个域的框架是不可能的。用
allFrames: true
调用browser.tabs.executeScript()
。该脚本将被注入到所有框架中,但如果一个框架需要更长的时间来加载,使用runAt: "document_start"
将只在主文档而不是框架上执行。使用"document_idle"
效果很好,但需要很长时间。
我也试过用 runAt: "document_start"
和 allFrames: false
调用 executeScript
,然后用 runAt: "document_idle"
和 allFrames: true
调用另一个。这将是中间立场,让主文档立即工作(大多数页面)但稍微延迟帧。但是,执行的脚本会在主页中被注入两次并导致错误。
None 让我在所有帧加载时执行脚本。我该怎么做?
我怀疑需要一个更麻烦的解决方案,如果您有想法,我将不胜感激。谢谢!
您可以更精细地控制脚本的注入。我有一个带有 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});
}
});
这需要 manifests.json
中的webNavigation
权限
也许这可以与您在 document_start
处注入主框架的第一个脚本一起使用。