使用 browser.tabs.executeScript 加载时在选项卡上执行的内容脚本不会触发 window.onload 事件

Posted

技术标签:

【中文标题】使用 browser.tabs.executeScript 加载时在选项卡上执行的内容脚本不会触发 window.onload 事件【英文标题】:Content script executed on tab while loading using browser.tabs.executeScript does not triggering window.onload event 【发布时间】:2021-01-31 12:23:39 【问题描述】:

在后台脚本的 firefox 扩展中,我们正在检查当前加载的选项卡,并检查该 URL 是否是我们想要的 URL,如果它是我们想要的 URL,那么我们正在借助浏览器在选项卡上执行一个 javascript 文件。 tabs.onupdated 事件使用 browser.tabs.executeScript 并且文件已成功执行,但内容脚本上存在的 window.onload 事件未执行 但是在内容脚本中执行的第一行的控制台语句

Background.js

 browser.tabs.onUpdated.addListener(
    function (tabId, changeInfo, tab) 
        // here checking wether to execute the script for the currently loading tab based on the URL of tab
        browser.tabs.executeScript(tab.id,  file: "jquery.min.js" );
         browser.tabs.executeScript(tab.id,  file: "automate.js" );
      
    ,
     properties: ["status"] 
  );

automate.js

console.log("automate.js executing");
window.addEventListener("load",function()
// this console.log statement not printed
 console.log("window is loaded");
)

【问题讨论】:

【参考方案1】:

默认内容脚本run at document_idle:

文档及其所有资源已完成加载。

解决方案:

它与load 事件条件相同,因此您不需要它。只需立即执行您需要的操作即可。

替代方案:

如果由于某种原因您需要在load 事件之前和之后执行某些操作,您可以使用document_endDOMContentLoaded 事件(DOM 已准备好,资源仍在加载)或@987654329 处运行脚本@(DOM为空,只解析<html>节点)。

browser.tabs.executeScript(tab.id,  file: 'jquery.min.js', runAt: 'document_end' );
browser.tabs.executeScript(tab.id,  file: 'automate.js', runAt: 'document_end' );

【讨论】:

如何在 MV3 中使用 'run_at' 属性?在文档link 只需说“脚本将在 document_idle 运行”。但我想在 document_end 运行 MV3中没有run_at,见crbug.com/1217895。 我能想到的主要用例在此之前注入脚本是有用的(开发工具、内容阻塞、polyfilling 等)需要精确的时间 -这个 API 不能提供。 这意味着他们不能提供 'run_at' 属性,因为像 adblock 这样阻碍广告收入的扩展可以使用它们? 不,他们只是不明白它为什么有用。 如果我回复像 这样的示例,如果想要删除特定节点或通过 Adblock 等 Chrome 扩展更改 CSS 样式时没有 run_at 属性(不仅仅是删除广告),可以这样做没有闪烁现象,项目成员会接受吗?

以上是关于使用 browser.tabs.executeScript 加载时在选项卡上执行的内容脚本不会触发 window.onload 事件的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)