Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在页面中的其他JavaScript之前,执行从内容脚本插入到页面中的页面脚本_Javascript_Google Chrome Extension_Content Script - Fatal编程技术网

在页面中的其他JavaScript之前,执行从内容脚本插入到页面中的页面脚本

在页面中的其他JavaScript之前,执行从内容脚本插入到页面中的页面脚本,javascript,google-chrome-extension,content-script,Javascript,Google Chrome Extension,Content Script,我正在尝试分析一些JavaScript代码,我使用函数重写来实现这些代码,以便对JavaScript库的调用可以通过我的JavaScript代码完成。我的JavaScript代码是Chrome扩展的一部分。通过Chrome扩展内容脚本,我将代码安装/注入到目标页面的DOM中 这对于加载页面后导出的函数很好。库调用通过我的函数进行。但是,有一些JavaScript代码在页面实际加载时运行(可能是在呈现DOM时)。这发生在注入自定义脚本之前。这样,在注入自定义脚本之前的函数调用就会丢失,或者那些Ja

我正在尝试分析一些JavaScript代码,我使用函数重写来实现这些代码,以便对JavaScript库的调用可以通过我的JavaScript代码完成。我的JavaScript代码是Chrome扩展的一部分。通过Chrome扩展内容脚本,我将代码安装/注入到目标页面的DOM中

这对于加载页面后导出的函数很好。库调用通过我的函数进行。但是,有一些JavaScript代码在页面实际加载时运行(可能是在呈现DOM时)。这发生在注入自定义脚本之前。这样,在注入自定义脚本之前的函数调用就会丢失,或者那些JavaScript调用不会通过我的函数

我使用内容脚本通过附加到DOM来实际注入其他JavaScript,如以下堆栈交换问题中所述:

我知道我可以使内容脚本的加载时间在DOM的开始/结束,但这是另一个脚本文件,我附加到目标页面的DOM中。我似乎不明白如何控制它

问题已在中解释 完全相同,但解决方案似乎不起作用。我的目的是让注入的脚本在任何JavaScript代码从网页执行之前执行。通过在manifest.json中指定
document\u start
,可以使内容脚本执行在网页之前运行,但不能执行我通过内容脚本注入的脚本(注入脚本如第一个链接中所述)。此注入的脚本未以任何特定方式运行

Manifest.json:
清单文件在
document_start
中添加了content脚本content.js,因此content.js在目标网页(基础页面)运行之前运行

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

content.js有下面的代码,我使用这些代码将main.js添加到DOM中,这样我就能够与目标页面环境中的JavaScript进行交互。我从另一个文件执行此操作,并将其附加到DOM,因为我无法通过内容脚本与目标页面的JavaScript进行交互,因为它们都不会相互干扰

为了进一步解释,main.js有一些JavaScript在目标页面中执行JavaScript期间拦截JavaScript调用。目标页面中的JavaScript调用库,我只想在这些库函数上编写一个包装器

var u=document.createElement('script');
u、 src=chrome.extension.getURL('main.js');
(document.head | | document.documentElement).appendChild(u);
u、 onload=函数(){
u、 parentNode.removeChild(u);
};
我希望main.js在目标页面的域和目标页面中的任何脚本中都可用,因为我是通过在
document\u start
运行的内容脚本注入它的

假设我在目标页面HTML中调用了这样的JavaScript函数,
someJSCall()
由目标页面的域定义


在这个场景中,main.js(通过我的Chrome扩展注入的代码)已经可用。因此,从
someJSCall()
函数调用JavaScript库需要通过main.js包装函数。 这个很好用

问题在于目标页面的JavaScript中定义了IIFE(立即调用的函数表达式)。如果这些IIFE调用进行库调用,则不会通过main.js截取。如果我通过Chrome Dev工具查看浏览器中加载的文件,我会发现在执行IIFE调用时main.js仍然没有加载


我希望我已经详细解释了这个问题。

根据我回答问题大约2.5周后您添加到问题中的附加信息,您正在向页面上下文添加代码,方法是在扩展名中包含一个“main.js”,这是一个单独的文件,使用的
类似于:


但是,当您这样做时,您将在
插入页面和从扩展获取“main.js”并在页面上下文中执行之间引入异步延迟。您将无法控制此延迟的时间,它可能会或不会导致您的代码在页面中的任何特定代码之前运行。它可能会在必须从外部URL获取代码之前运行,但可能不会

为了保证代码同步运行,必须将其作为实际代码插入到
标记中,而不是使用
src
属性拉入另一个文件。这意味着要在页面中执行的代码必须存在于加载到页面中的内容脚本文件中

需要在页面上下文中执行代码是一个相当常见的需求。我需要在浏览器扩展(如Chrome、Firefox、Edge等)和用户脚本中这样做。我还希望能够将数据传递给这样的代码,因此我编写了一个名为
executeInPage()
,它将接受在当前上下文中定义的函数,将其转换为文本,将其插入页面上下文,并在传递任何参数(大多数类型)的同时执行它。如果有兴趣,您可以在我的答案和我的答案中找到
executeInPage()

以下是我根据问题的原始版本给出的原始答案,它没有显示内容脚本的执行时间,也没有解释添加到页面的代码是在单独的文件中,而不是在实际的内容脚本中。 您在问题中声明“可以将内容脚本的加载时间控制在DOM的开始/结束位置”,但您没有明确说明为什么要这样做