我正在尝试编写Chrome扩展程序,我有一个带有此代码的background.html:
var x = "test";
function tabChanged(id, info, tab){
if(info.status == 'complete'){
chrome.tabs.executeScript(id, {code:"try{alert(x);}catch(e){alert(e);}"}, null);
}
}
chrome.tabs.onUpdated.addListener(tabChanged);
chrome.tabs.getAllInWindow(null,function(tabs){
for(var index=0; index < tabs.length; index++){
chrome.tabs.executeScript(tabs[index].id, {code:"try{alert(x);}catch(e){alert(e);}"}, null);
}
});
但是在executeScript中始终未定义变量“x”。
如何从executeScript获取/设置x?不使用消息传递。
答案 0 :(得分:3)
内容脚本在网页的上下文中执行。有关详细信息,请参阅Chrome文档中的Content Scripts部分。
如果要将字符串变量从后台页面传递到chrome.tabs.executeScript
,则必须执行以下操作:
var x = "test";
chrome.tabs.executeScript(id, {code:"var x = '"+x+"'; try{alert(x);}catch(e){alert(e);}"},null);
如果你想修改变量,你只有一种方式 - 消息:
var x = 1;
console.log('x=' + x);
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
console.log(request);
if(request.command == 'setVar') {
window[request.name] = request.data;
}
});
chrome.browserAction.onClicked.addListener(function() {
var code = "chrome.extension.sendRequest({command: 'setVar', name: 'x', data: 2});";
chrome.tabs.executeScript(null, {code:code});
window.setTimeout(function(){console.log('x=' + x);}, 1000);
});
答案 1 :(得分:0)
对于 chrome Chrome 92+
,您可以使用 args
chrome.tabs.query({active: true, currentWindow: true}).then(([tab])=>{
const para = "Hello world!!!"
chrome.scripting.executeScript({
target: {tabId: tab.id},
function: (args) => {
alert(args)
},
args: [para]
})
})
或者您可以使用 chrome.storage
{
"manifest_version": 3,
"permissions": [
"storage",
"activeTab",
"scripting"
]
}
chrome.storage.sync.set({msg: "hello world"})
chrome.tabs.query({active: true, currentWindow: true}).then(([tab])=>{
chrome.scripting.executeScript({
target: {tabId: tab.id},
function: () => {
chrome.storage.sync.get(['msg'], ({msg})=> {
console.log(`${msg}`)
alert(`Command: ${msg}`)
})
}
})
})
答案 2 :(得分:-1)
您的变量未定义的原因是因为您在字符串中引用变量,所以您只需执行此操作:
var yourVar = "your variable"
//define your variable
chrome.tabs.executeScript({code: 'Your code here' + yourVar + ';}'})
//then format it like this ({code: "Your code as a string" + your variable + "code"})
如果你想稍后改变变量而不是使用你的新变量做同样的事情,那么它非常直接