我正在尝试将远程脚本作为Chrome扩展中的内容脚本注入,但我感觉自己陷入了Chrome执行环境的模糊地带(至少对我来说是这样)。
我想使用jQuery的
以下是注入代码(在这里明智地建议):
错误是:
我想使用jQuery的
$.getScript
来实现此目的(以及其他目的)。以下是注入代码(在这里明智地建议):
// 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");
错误信息为: "$未定义"
错误中提到的$
似乎是指myremotescript.js
函数中的变量,如果将myremotescript.js
更改为以下内容,则代码可以正常工作:
document.body.style.backgroundColor = "green";
看起来不仅仅是 $
没有定义。如果我将 myremotescript.js
改为:
function Do(){
document.body.style.backgroundColor = "green";
}
然后在$.getScript
的回调函数中执行Do()
:
chrome.tabs.executeScript(null, {
code: '$.getScript("https://mysite.com/myremotescript.js", function(){ Do(); })'
});
错误是:
"Do is not defined"
。有什么想法/解释/建议吗?编辑:解决方案:根据 @Rob-W 的回答,它起作用了。唯一需要添加的怪癖是将数据类型标记为“文本”,以使$.get()
不会出错。另外,我不需要执行eval
,因为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();" });
});
})
$.get()
进行跨域xhr,所以需要添加匹配模式的权限(出于某种原因,$.getScript()
不需要)。这是真的吗?在扩展安装期间是否向用户添加特殊警告? - New Dev$.getScript
来克服这个问题,然后检索<script>
标签的innerHtml
并将其应用于executeScript
? - New Dev