远程脚本作为Chrome扩展程序中的内容脚本

时间:2013-08-11 07:17:41

标签: jquery google-chrome-extension

我试图在Chrome扩展程序中注入一个远程脚本作为内容脚本,但我觉得我遇到了Chrome执行环境的阴暗(至少对我而言)区域。

我想使用jQuery' $.getScript用于此目的(和其他目的)。

这里是注射码(出色地suggested here):

// inject jQuery
chrome.tabs.executeScript(null, { file: "js/jquery.js" }, function() {
   // inject remote script with jQuery
   chrome.tabs.executeScript(null, { code: '$.getScript("https://mysite.com/myremotescript.js", function(){ })' });
});

以下是远程脚本 myremotescript.js - 这很简单:

$("body").css("backgroundColor", "green");

错误"$ is not defined"

错误中引用的$似乎是myremotescript.js函数的myremotescript.js,因为document.body.style.backgroundColor = "green"; 更改为:

$

似乎不仅myremotescript.js未定义。如果我将function Do(){ document.body.style.backgroundColor = "green"; } 更改为:

$.getScript

然后从chrome.tabs.executeScript(null, { code: '$.getScript("https://mysite.com/myremotescript.js", function(){ Do(); })' });

的回调中执行Do()
"Do is not defined"

错误是:$.get()

任何想法/解释/建议?

编辑:解决方案 @ Rob-W 回答后,它有效。我需要添加以使eval不出错的唯一怪癖是将数据类型标记为" text"。另外,我不需要executeScript,因为$.get("https://mysite.com/myremotescript.js", null, null, "text") .done(function(remoteCode){ chrome.tabs.executeScript(null, { code: remoteCode }, function(){ chrome.tabs.executeScript(null, { code: "Do();" }); }); }) 可以接受代码为文本:

{{1}}

1 个答案:

答案 0 :(得分:1)

$.getScript默认注入<script>元素以从其他来源加载脚本。因此,代码在页面的上下文中运行,内容脚本(see also)。

如果您真的想使用jQuery来获取脚本,请替换

$.getScript("https://mysite.com/myremotescript.js", function(){ });

使用以下内容(eval用作回调,因此它会评估请求的响应)

$.get("https://mysite.com/myremotescript.js", eval);

虽然这有效,但我建议缓存脚本的响应主体。然后,如果网络连接断开,您的分机将不会中断。而且,更重要的是,用户不会对每个页面加载产生无用的请求。我之前已经充实了这个概念,请参阅this answer