我正在撰写Google Chrome扩展程序。我已经到了可以来回传递消息的阶段,但是我在使用响应回调时遇到了麻烦。我的后台页面打开一个消息页面,然后消息页面从后台请求更多信息。当消息页面收到响应时,我想根据响应用自定义文本替换消息页面上的一些标准文本。这是代码:
chrome.extension.sendRequest({cmd: "sendKeyWords"}, function(response) {
keyWordList=response.keyWordsFound;
var keyWords="";
for (var i = 0; i<keyWordList.length; ++i)
{
keyWords=keyWords+" "+keyWordList[i];
}
document.getElementsByClassName("comment")[1].firstChild.innerHTML=keyWords;
alert (document.getElementsByClassName("comment")[1].firstChild.innerHTML);
});
第一个问题:这一切似乎都运行正常,但页面上的文字没有改变。我几乎肯定是因为在页面加载完成后回调完成,其余代码也在回调完成之前完成。如何使用新文本更新页面?我可以收听完成的回调或类似的内容吗?
第二个问题:我追求的程序首先打开消息页面,然后消息页面从后台请求关键字列表。由于我总是想要关键字列表,因此在创建选项卡时发送它更有意义。我能这样做吗?以下是打开消息页面的背景代码:
//when request from detail page to open message page
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if(request.cmd == "openMessage") {
console.log("Received Request to Open Message, Profile Score: "+request.keyWordsFound.length);
keyWordList=request.keyWordsFound;
chrome.tabs.create({url: request.url}, function(tab){
msgTabId=tab.id; //needed to determine if message tab has later been closed
chrome.tabs.executeScript(tab.id, {file: "message.js"});
});
console.log("Opening Message");
}
});
在第二个问题的基础上,我也在后台尝试了这个:
//when request from detail page to open message page
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if(request.cmd == "openMessage") {
console.log("Received Request to Open Message, Profile Score: "+request.keyWordsFound.length);
keyWordList=request.keyWordsFound;
var keyWords="";
for (var i = 0; i<keyWordList.length; ++i)
{
keyWords=keyWords+" "+keyWordList[i];
}
console.log(keyWords);
chrome.tabs.create({url: request.url}, function(tab){
msgTabId=tab.id; //needed to determine if message tab has later been closed
chrome.tabs.executeScript(tab.id, {code: "document.getElementsByClassName('comment')[1].firstChild.innerHTML=keyWords;", file: "message.js"});
});
console.log("Opening Message");
}
});
但这也不起作用,它只是中断并且没有执行任何脚本。
答案 0 :(得分:1)
在阅读@serg之前的回答后,我可以回答问题的第一部分。问题源于sendRequest的异步性质。需要回调。以下是有效的代码:
function getKeyWords(action, callback){
chrome.extension.sendRequest(
{
cmd: action
},
function(response)
{
callback(response.keyWordsFound);
}
);
}
var keyWords="";
getKeyWords("sendKeyWords", function(reply) {
keyWordList=reply;
for (var i = 0; i<keyWordList.length; ++i)
{
keyWords=keyWords+" "+keyWordList[i];
}
msgComment1.innerHTML="<strong>"+keyWords+"</strong>";
console.log("reply is:", keyWords);
});
再次,我感谢@serg。感谢。