2011-06-28 53 views
1

我正在寫谷歌瀏覽器擴展。我已經達到了可以輕鬆地傳遞消息的階段,但是使用響應回調遇到了麻煩。我的後臺頁面打開一個消息頁面,然後消息頁面從後臺請求更多信息。當消息頁面收到響應時,我想用基於響應的自定義文本替換消息頁面上的一些標準文本。這裏是代碼:谷歌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

沿着上述第二個問題的思路,我也試過這個: – Jerome

回答

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。謝謝。