扩展注入的<script>标记执行顺序

布拉德

我有一个浏览器扩展程序,可以执行以下操作:

  1. 在执行内容脚本document_start
  2. 该内容脚本在我的扩展程序中插入了<script>具有srcJavaScript文件属性的元素
  3. 该JavaScript文件具有一些浏览器功能。

所有这三件事都需要在加载的页面上运行任何脚本之前发生。为此,我在自己的文件中创建了以下内容manifest.json

  "content_scripts": [
    {
      "matches": [
        "https://example.com/*",
      ],
      "run_at": "document_start",
      "js": ["js/inject.js"]
    }
  ]

然后用于inject.js

console.log('Inject');
const scriptEl = document.createElement('script');
scriptEl.src = chrome.runtime.getURL('js/hooks.js');
(document.head || document.documentElement).appendChild(scriptEl);

在中hooks.js,目前仅进行一些调试:

console.log('Hooks');

最后,在测试HTML页面上,我还有一些脚本:

<!DOCTYPE html>
<html>
  <head>
    <script>
      document.addEventListener('DOMContentLoaded', async (e) => {
        console.log('DOMContentLoaded');
      });
    </script>
  </head>
  <body>
    <h1>Test Page</h1>
  </body>
</html>

我期望在控制台上看到以下顺序:

Inject
Hooks
DOMContentLoaded

相反,我看到的是:

Inject
DOMContentLoaded
Hooks

如果使用浏览器的开发人员工具检查DOM,<script src=".../js/hooks.js"></script>则会看到紧接在之前插入<head>这是注射方法所期望的。

有没有办法让此脚本在所有其他脚本之前执行?

布拉德

基于@CertainPerformance的想法,这是一种解决方法:

console.log('Inject');

const req = new XMLHttpRequest();
req.open('GET', chrome.runtime.getURL('js/hooks.js'), false);
req.send(null);
if (req.status === 200) {
  const scriptEl = document.createElement('script');
  scriptEl.textContent = req.responseText;
  (document.head || document.documentElement).appendChild(scriptEl);
}

令人讨厌的东西,但今天就完成了工作。如果有人有更合适的解决方案,请告诉我!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

流星:通过“流星添加”与使用“ <script>”标记进行注入

来自分类Dev

JavaScript-<script>标签的执行顺序

来自分类Dev

对JS函数使用script_queue时的执行顺序

来自分类Dev

动态注入脚本元素时的执行顺序

来自分类Dev

动态注入脚本元素时的执行顺序

来自分类Dev

扩展类的依赖注入?

来自分类Dev

Zend框架2:如何在prependFile()中设置<script>标记输出的顺序

来自分类Dev

HTMLScriptElement与'<script>'标记

来自分类Dev

<script>标记src属性

来自分类Dev

指定<script>类型的顺序

来自分类Dev

使用innerHTML插入内容不会执行<script>标记,这是否可以保证安全?

来自分类Dev

Chrome扩展程序注入iframe

来自分类Dev

扩展方法中的方法注入

来自分类Dev

Unity 扩展依赖注入容器

来自分类Dev

在<script src =“ ...”> </ script>标记内运行JavaScript?

来自分类Dev

</ script>标记放置在错误的位置

来自分类Dev

<Script>标记内的HTML代码

来自分类Dev

在<script>标记内调用AngularJS

来自分类Dev

加载JavaScript <script>文件的顺序

来自分类Dev

标记扩展名

来自分类Dev

XML模式扩展顺序

来自分类Dev

C宏扩展顺序

来自分类Dev

重击转义/扩展顺序

来自分类Dev

*的字母扩展顺序

来自分类Dev

C宏扩展顺序

来自分类Dev

Chrome扩展程序与GA Script对话?

来自分类Dev

content_script中的chrome扩展问题

来自分类Dev

Chrome 扩展 content_script 隔离

来自分类Dev

webpackHtmlPlugin:控制注入文件的顺序