Обновление текста расширения Google Chrome после ответного обратного вызова - PullRequest
1 голос
/ 28 июня 2011

Я пишу расширение 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 Ответ

1 голос
/ 31 июля 2011

Я могу ответить на первую часть вопроса после прочтения предыдущего ответа @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. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...