我目前正在处理Chrome扩展程序,源代码为available on Github。目标是将自定义Javascript注入网页。
目前,我将每个自定义Javascript Inject 存储在 localStorage 中,并从内容网址中调用它们。我已将 run_at 设置为 document_start 。
我用它来从后台脚本中获取存储的注入:
chrome.extension.sendMessage({method:"get_injects"},function(injects){
for(index in injects){
if(/^items\./.test(index)){
itemJSON = injects[index];
//if(window.location.host.toString().indexOf(itemJSON.url)){
if(window.location.host.toString().match(itemJSON.url + '$')){
var js = itemJSON.js.toString();
eval(js);
}
}
}
});
我希望在加载文档之前运行注入脚本 完全。但是使用提出的方法,控件将通过chrome.extension.sendMessage
并且不会等待获得响应injects
。因此,eval(js);
将在页面加载的中间执行。我该如何解决这个问题,这样我才能在页面加载之前注入?
答案 0 :(得分:4)
在Chrome中,每个标签都在自己的流程中运行。后台页面在扩展过程中运行,该过程与您正在挂钩的选项卡不同。所以我担心没有真正的同步解决方案。
即使使用chrome.storage(没有原始限制,因此不需要背景页面)也是异步的。
但这是一个适用于大多数页面的解决方案:
答案 1 :(得分:0)
是一种从后台页面到当前内容脚本同步获取任意数量数据的方法。您应该避免同步阻止扩展中的代码,因此我不会提供示例代码,以阻止在生产代码中将其复制粘贴。
流程是:
XMLHttpRequest
(到假URL)以启动这些步骤。chrome.webRequest.onBeforeRequest
事件拦截此请求。localStorage
或背景页面上的本地变量,将其转换为blob,然后使用var url = URL.createObjectURL(new Blob([ 'data chunks here' ]));
将其转换为网址。return {redirectUrl: url};
事件中的onBeforeRequest
发回数据。URL.revokeObjectURL(url);
释放数据使用的资源。最后,尽可能避免同步,阻止代码!!