这适用于在页面加载后引入的函数。库调用通过我的函数进行。但是,在页面实际加载时(可能在渲染DOM时),会运行一些JavaScript代码。这发生在注入自定义脚本之前。因此,在注入自定义脚本之前的函数调用对我来说不可见,或者这些JavaScript调用不经过我的函数。
我利用Content Script通过将其附加到DOM中来实际注入其他JavaScript,如下面的Stack Exchange问题所述: 通过脚本内容将代码插入页面上下文 我知道我可以使Content Script的加载时间在DOM的开头/结尾,但这是我附加到目标页面的另一个脚本文件。我似乎不明白如何控制它。
在使用Chrome扩展程序是否可以在网页的任何脚本运行之前在网页上下文中运行脚本?中解释的问题是完全相同的,但解决方案似乎不起作用。我的意图是使注入的脚本在网页的任何JavaScript代码执行之前执行。通过在manifest.json中指定
document_start
,可以使内容脚本执行在网页之前运行,但不能使我通过内容脚本注入的脚本运行(如第一个链接中所述)。这个注入的脚本没有以任何特定的方式运行与网页相关。Manifest.json:
清单文件将内容脚本content.js添加到
document_start
,因此在目标网页(基础页面)运行之前运行content.js。"content_scripts":[
{
"matches":["<all_urls>"],
"js":["content.js"],
"run_at":"document_start",
"all_frames":false
}
],
content.js:
content.js有以下代码,我将main.js添加到DOM中,这样我就能够与目标页面环境中的JavaScript进行交互。我从不同的文件中执行此操作并将其附加到DOM中,因为我不能通过Content Scripts与目标页面的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 = function() {
u.parentNode.removeChild(u);
};
我希望main.js在目标页面的域中可用,并且任何目标页面中的脚本都可以使用,因为我是通过在document_start
运行的内容脚本来注入它的。
假设我在目标页面HTML中调用了一些JavaScript函数,例如someJSCall()
是由目标页面的域定义的。
<html onLoad="someJSCall( )">
在这种情况下,通过我的Chrome扩展程序注入的代码main.js已经可用。因此,从
someJSCall()
函数对JavaScript库的调用将通过main.js包装函数进行。这很好地工作。问题出现在目标页面的JavaScript中定义了IIFE(立即调用的函数表达式)。如果这些IIFE调用进行库调用,则不会通过我的main.js拦截。如果我通过Chrome Dev Tools查看在浏览器中加载的文件,则在执行IIFE调用时仍未加载main.js。
我希望我已经详细解释了问题。
@[用户名]
来提醒他们。对于我来说,这将是@Makyen
。在这种情况下,直到现在,也就是2.5年后,我才知道你已经更新了问题。 - Makyen