响应回调后谷歌chrome扩展更新文本

时间:2011-06-28 05:47:24

标签: callback google-chrome-extension response messaging

我正在撰写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");
    }
});

但这也不起作用,它只是中断并且没有执行任何脚本。

1 个答案:

答案 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。感谢。