我正在写一个Chrome扩展,它需要根据一些给定的参数修改特定域中的页面,这需要XSS才能获得,所以简单地使用内容脚本似乎是不可能的。因此,我决定使用tabs.executeScript注入脚本。
现在我需要知道两件事:首先,在使用executeScript时如何将参数传递给脚本?我想我可以使用消息,但是没有更直接的方法在注入脚本时传递参数吗?
其次,我的脚本使用jQuery,所以我需要以某种方式包含jQuery。这很傻,但我不知道该怎么做。到目前为止,我在正在编写的HTML页(例如background.html)中嵌入了jQuery。
发布于 2011-02-13 02:24:33
如果你不想使用消息传递,那么:
chrome.tabs.executeScript(tabId, {file: "jquery.js"}, function(){
chrome.tabs.executeScript(tabId, {code: "var scriptOptions = {param1:'value1',param2:'value2'};"}, function(){
chrome.tabs.executeScript(tabId, {file: "script.js"}, function(){
//all injected
});
});
});
(jquery.js
应该放在扩展文件夹中)。脚本选项将在script.js
的scriptOptions
变量中可用。
使用消息传递也很简单:
chrome.tabs.executeScript(tabId, {file: "jquery.js"}, function(){
chrome.tabs.executeScript(tabId, {file: "script.js"}, function(){
chrome.tabs.sendMessage(tabId, {scriptOptions: {param1:'value1',param2:'value2'}}, function(){
//all injected
});
});
});
您需要向script.js
添加一个请求监听器
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
var scriptOptions = message.scriptOptions;
console.log('param1', scriptOptions.param1);
console.log('param2', scriptOptions.param2);
doSomething(scriptOptions.param1, scriptOptions.param2);
});
发布于 2017-12-13 06:31:18
基于上面的直接方法,我可以直接从我的Chrome扩展上的后台脚本将代码注入到一个新的标签中。但是,需要注意的是,executeScript命令的代码部分不会简单地接受变量,而只接受一个字符串。因此,在实验之后,我发现我们需要预先设置命令字符串,并包括我们想要的变量。如下所示:
var sendCode = 'document.getElementsByClassName("form-control n-gram")[0].value = "' + TMObj.brand + '";';
var TMUrl = "http://website.com";
chrome.tabs.create({ url: TMUrl }, function(tab){
chrome.tabs.executeScript(null, {code: sendCode});
});
});
这样做效果很好!
发布于 2018-12-01 17:46:46
包含依赖项的更好方法
通过以下方式将依赖库(和其他.js文件)添加到manifest.json
中的后台脚本:
"background": {
"scripts": [
"jquery.js",
"main.js"
]
在应用程序代码之前列出依赖项,以便在此之前加载它们。
Reference: Register Background Scripts
注意:这将执行脚本的急切加载,而不是像executeScript
那样的延迟加载。
https://stackoverflow.com/questions/4976996
复制相似问题