Получение переменных вне executeScript в расширении chrome
Я пытаюсь закодировать расширение chrome, и у меня есть фон.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);
}
});
Но переменная " x " всегда неопределенна внутри executeScript.
Как я могу получить / установить x из executeScript? без использования сообщений.
2 ответов:
Скрипты содержимого выполняются в контексте веб-страницы. Дополнительную информацию смотрите в разделе Content Scripts в Chrome docs.
Если вы хотите передать строковую переменную из фоновой страницы в
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); });
Причина, по которой ваша переменная не определена, заключается в том, что вы ссылаетесь на свою переменную внутри строки, поэтому вы можете просто сделать это:
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"})
И если вы хотите изменить переменную позже, чем просто сделать то же самое, но с новой переменной, это довольно прямолинейно
Comments