在安装内容脚本之前停止运行javascript

时间:2016-12-20 16:06:57

标签: javascript google-chrome-extension content-script

我正在尝试分析一些我使用函数重写的javascript代码,以便调用JS库来通过我的javascript代码。我的JavaScript代码是Chrome扩展程序的一部分,我通过内容脚本通过chrome扩展程序将其安装/注入目标页面的DOM。 这适用于在加载页面和库调用通过我的函数后引起的函数。但是有一些JavaScript代码在页面实际加载时运行(可能在呈现DOM时)。这是在我的自定义脚本注入之前发生的。这样,注入自定义脚本之前的函数调用对我来说是丢失的,或者那些JS调用不通过我的函数。 我使用内容脚本通过附加到DOM来实际注入其他JavaScript,如下面的链接所示。

Insert code into the page context using a content script

我知道我可以将内容脚本的加载时间处理到DOM的开头/结尾但是这是我附加到目标页面的DOM的另一个脚本文件,我似乎不明白如何控制它。 任何人的任何帮助都非常感谢。谢谢。

编辑: Is it possible to run a script in context of a webpage, before any of the webpage's scripts run, using a chrome extension?中解释的问题 是完全一样的,但解决方案似乎不起作用。我的目的是使注入的脚本在任何js代码从网页执行之前执行。通过在manifest.json中指定document_start,可以使内容脚本执行在网页之前运行,而不是我通过内容脚本注入的脚本(注入脚本,如第一个链接中所述)。此注入的脚本没有以任何特定方式运行相对于网页

编辑2:

的manifest.json 清单文件在document_start中添加了内容脚本content.js。所以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,因为我无法通过内容脚本与目标页面的JavaScript进行交互,因为它们都不会相互干扰。 为了进一步解释,main.js有一些JavaScript在目标页面中执行JS时拦截JS调用。目标页面中的JS调用库,我打算在这些库函数上编写一个包装器。

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中调用了一些这样的JS函数,someJSCall()是由目标页面的域定义的。

在这种情况下,main.js(通过我的chrome扩展注入的代码)已经可用。因此,从someJSCall函数调用JS库会通过main.js包装函数。 这很好。

问题是当目标页面的JS中定义了IIFE(立即调用的函数表达式)时。如果这些IIFE调用进行库调用,则不会通过我的main.js拦截。如果我通过Chrome开发工具查看浏览器中加载的文件,我会看到在执行IIFE调用时仍未加载main.js。

我希望我已经详细解释了这个问题。如果还不清楚,请告诉我。

谢谢。

1 个答案:

答案 0 :(得分:0)

您在问题中说明您可以处理内容脚本的加载时间,以便在DOM的开始/结束时使用#34;但是您不清楚为什么您无法通过document_start执行内容脚本来解决您的问题。

您可以通过在run_at manifest.json条目中为content_scripts属性指定document_start,或者为您注入的网页注入脚本,或者传递给runAtchrome.tabs.executeScript()选项。如果您这样做,那么当document.headdocument.body都是null时,您的脚本就会开始运行。然后,您可以控制添加到页面的内容。

对于chrome.tabs.executeScript(),您的脚本运行的时间取决于您在加载页面的过程中执行chrome.tabs.executeScript()的时间。由于处理的异步性质(您的后台脚本通常在不同的进程中运行),当document.headdocument.body都是null时,很难一致地注入脚本。我所做的最好的事情就是在这种情况下有时会注入脚本,有时在填充页面之后,但在获取任何其他资源之前。此时间适用于大多数情况,但如果您确实需要在页面存在之前运行脚本,则应使用 manifest.json content_scripts条目。

headbody存在之前运行内容脚本,您可以控制首先插入的内容。因此,您可以在页面上的任何其他内容之前插入<script>。这应该使您的脚本在页面上下文中的任何其他脚本之前执行。