我试图在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 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}}
答案 0 :(得分:1)
$.getScript
默认注入<script>
元素以从其他来源加载脚本。因此,代码在页面的上下文中运行,不内容脚本(see also)。
如果您真的想使用jQuery来获取脚本,请替换
$.getScript("https://mysite.com/myremotescript.js", function(){ });
使用以下内容(eval
用作回调,因此它会评估请求的响应)
$.get("https://mysite.com/myremotescript.js", eval);
虽然这有效,但我建议缓存脚本的响应主体。然后,如果网络连接断开,您的分机将不会中断。而且,更重要的是,用户不会对每个页面加载产生无用的请求。我之前已经充实了这个概念,请参阅this answer。