2011-03-03 143 views
0

我已經寫了谷歌瀏覽器的擴展,我有一個錯誤,我需要一個幫助解決。 我所做的是使用文本選擇或在flickr上輸入文字搜索照片,然後創建結果選項卡。 擴展工作大部分時間。但有時會創建一個沒有結果的空白標籤,當我重複相同的搜索時,它會顯示結果。我認爲這與HTML文件消息傳遞可能有關。我不得不說,我總是收到來自flickr的結果,以便flickr的請求/響應可以正常工作。有時候,當我使用其他選項卡或在等待結果時在其他選項卡上執行某些操作時會發生錯誤。你能幫我弄清楚故障在哪裏嗎?鉻擴展連接問題

背景文件:

function searchSelection(info,tab){ 
var updated; 
    if(info.selectionText==null){ 
     var value = prompt("Search Flickr", "Type in the value to search"); 
     updated=makeNewString(value); 
    } 
    else{ 
     updated=makeNewString(info.selectionText); 
    } 
    var resultHtml; 
    var xhReq = new XMLHttpRequest(); 
    xhReq.open(
    "GET", 
    "http://api.flickr.com/services/rest/?method=flickr.photos.search&text="+updated+ 
    "&api_key=a0a60c4e0ed00af8d70800b0987cae70&content_type=7&sort=relevance&per_page=500", 
    true); 
    xhReq.onreadystatechange = function() { 

     if (xhReq.readyState == 4) { 
      if (xhReq.status == 200) { 
      chrome.tabs.executeScript(tab.id, {code:"document.body.style.cursor='auto';"}); 
       var photos = xhReq.responseXML.getElementsByTagName("photo"); 
       if(photos.length==0){ 
        alert("No results found for this selection"); 
        chrome.tabs.executeScript(tab.id, {code:"document.body.style.cursor='auto';"}); 
        return; 
       } 
       var myJSPhotos=[]; 
       for(var i=0; i<photos.length; i++){ 
        var data={"id":photos[i].getAttribute("id"),"owner":photos[i].getAttribute("owner"), 
           "secret":photos[i].getAttribute("secret"),"server":photos[i].getAttribute("server"), 
           "farm":photos[i].getAttribute("farm"),"title":photos[i].getAttribute("title")}; 
        myJSPhotos[i]=data; 
       } 

        chrome.tabs.create({"url":"results.html"},function(thistab){ 
        var port= chrome.tabs.connect(thistab.id); 
        port.postMessage({photos:myJSPhotos}); 
       }); 

      } 
     }; 
    }; 
    xhReq.send(null); 
    chrome.tabs.executeScript(tab.id, {code:"document.body.style.cursor='wait';"}); 

} 


var context="selection"; 
var id = chrome.contextMenus.create({"title": "search Flickr", "contexts":[context,'page'],"onclick":searchSelection}); 

結果HTML:只在js文件的引用res.js

res.js:

chrome.extension.onConnect.addListener(function(port) { 
    port.onMessage.addListener(function(msg) { 
//*****// 
    var photos=msg.photos; 
    createPage(photos); 

    }); 
}); 

我不得不提到的是,當該標籤是空的,如果我把//*****//部分警報,它不會 火災。 但是當我在標籤創建回調函數部分打印出photos.length它打印出正確的結果。

+0

請這部分提供代碼:'//這是我發送請求到flickr的地方,並將結果編輯成JSon' – serg 2011-03-03 16:43:43

+0

更新了部分 – mary 2011-03-04 11:31:01

回答

0

嘗試在清單中爲您的res.js設置"run_at":"document_start"選項。

我覺得從chrome.tabs.create回調馬上解僱,而無需等待網頁腳本加載,所以你可以嘗試這樣的事情,而不是:

//global vars 
var createdTabId = null; 
var myJSPhotos = null; 

xhReq.onreadystatechange = function() { 

    //assign myJSPhotos to a global var 

    chrome.tabs.create({"url":"results.html"},function(thistab){ 
     createdTabId = thistab.id; 
    }); 
} 

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    if(changeInfo.status == "complete" && tab.id == createdTabId) { 
     createdTabId = null; 

     //now page is loaded and content scripts injected 
     var port = chrome.tabs.connect(tab.id); 
     port.postMessage({photos:myJSPhotos}); 

    } 
}); 
+0

,但是爲什麼大多數時候它工作正常並且在新頁面上顯示圖像,並且只有很小一部分時間顯示空白頁?當我在「創建選項卡」中進行警報時,只有在我調用上下文菜單時纔會打印。 – mary 2011-03-05 07:49:29

+0

我的清單:{ 「名」: 「Flickr圖片搜索」, 「版本」: 「1.0」, 「說明」: 「我所做的第一個分機。」 「圖標」:{ 「16」 :「icon.png」}, 「background_page」:「background.html」, 「permissions」:[「tabs」, 「http://api.flickr.com/","contextMenus","http: // */*「,」https:// */*「\t ] } – mary 2011-03-05 08:00:31

+0

@mary我認爲這是因爲回調製表符創建被觸發而沒有等待內容腳本加載,因此當您通過端口內容腳本可能還沒有收到它。 – serg 2011-03-05 08:03:04