2012-05-05 65 views
0

我要解決以下問題: 我有一個彈出窗口,並在那裏有popup.html一個選擇標籤:如何正確傳遞數據到contentscript?

<select id="chart_select"> 
           <option id="chart_0" value="default">Select One</option> 
           <option id="chart_1" value="table_1">DISPLAY CLIENT VERSION USAGE CHART</option> 
           <option id="chart_2" value="table_2">DISPLAY MOST ACTIVE REALMS CHART</option> 
           <option id="chart_3" value="table_3">DISPLAY MOST ACTIVE USERS CHART</option> 
           <option id="chart_4" value="table_4">DISPLAY AVERAGE USER FRAMERATE CHART</option> 
           <option id="chart_5" value="table_5">DISPLAY AVERAGE REALM FRAMERATE CHART</option> 
           <option id="chart_6" value="table_6">DISPLAY USER LOGGED IN '' TIMES CHART</option> 
           <option id="chart_7" value="table_7">DISPLAY LOGINS per ORGANISATION</option> 
          </select> 

所以,我保存到localStorage['thetable']選定的價值。例如,我選擇DISPLAY LOGINS per ORGANISATION,然後我將"table_7"保存到本地存儲。

然後,在background.html我想從localStorage的數據傳遞給我的內容腳本,像這樣:

if(localStorage.getItem('thetable') != ""){ 
    chrome.tabs.getSelected(null, function(tab) { 
     chrome.tabs.sendRequest(tab.id, {thetable: localStorage.getItem('thetable') }, function(response) { 
      if(response.dom != ""){ 
       localStorage.setItem('thedom',response.dom); 
      } 
     }); 
    }); 
} 

在此之後,我contentscript應該捕獲請求,併發回與DOM,響應其已由id指定,存儲在localStorage('thetable')中。

contentscript.js: 

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if (request.thetable != "") { 
     sendResponse({dom: document.getElementById(request.thetable).innerHTML}); 
    } 
}); 

注:request.thetable應該是 「table_7」。 dom應該是該網站的<table id="table_7">的innerHTML。它存在,我做了所有這些元素。

另外一個信息,我保存選擇值在不同的文件中,在popup.js,我保存「table_7」localStorage在這個文件中。但localStorage也可以從background.html獲得,所以我認爲它不應該是一個問題。


流程:

  • 我選擇的東西(FE:每個組織DISPLAY LOGINS)
  • popup.html點擊"Save Btn",然後popup.js節省 「table_7」 到localStorage的
  • 然後我點擊「運行Btn」popup.html,然後popup.js重新加載 當前標籤:

    chrome.tabs.getSelected(null,function(tab){ chrome.tabs.reload(tab.id); });

    我這樣做,因爲我的內容收集信息只有當標籤是 重新加載。

  • 重裝之後,我想,background.html應該發送請求 contentscript與info( 「table_7」)

  • contentscript得到DOM,從網站,FE:document.getElementById("table_7").innerHTML併發送回這backgound頁。

的問題是,我得到這個警告,當我運行的流程: enter image description here

有人可以幫我,如何解決這個問題? :/感謝

+0

而不是重新加載標籤來激活內容腳本,我建議使用['chrome.tabs.executeScript(tab.id,{文件:「name_of_script.js」}); '](http://code.google.com/chrome/extensions/tabs.html#method-executeScript)運行內容腳本。 –

+0

然後我得到'在錯誤期間tabs.executeScript:未知的錯誤。 chromeHidden.handleResponse'在控制檯中。順便說一下,如何強制後臺腳本發送請求? –

+0

你能發佈一個最小的測試用例(包括清單文件的相關部分)嗎? –

回答

0

我找到了一個解決方案:

彈出。JS: 與保存按鈕,我保存的選擇的值(= 「* table_7 *」),並重新加載所選擇的標籤:

$("#save_btn").click(function(){ 
     if($("#chart_select :selected").val()!="default"){ 
      var sel_val = $("#chart_select :selected").val(); 
      localStorage.setItem('thetable',sel_val); 
      chrome.tabs.getSelected(null,function(tab){ 
       chrome.tabs.reload(tab.id); 
      }); 
     } 
    }); 
  • 只要網站被重新加載,content_script.js獲得焦點:

content_script.js:

// SEND DOM structure to the background page 
chrome.extension.sendRequest({ action: "waiting" },function(response){ 
    if(response){ 
     chrome.extension.sendRequest({ dom: document.getElementById(response.thetable).innerHTML }); 
    } 
}); 
  • 該代碼向後臺頁面發送「等待」請求,並等待響應,響應已到,代碼獲取頁面DOM並將其發回。 所以它是一個嵌套的sendRequest。

background.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if(request.action=="waiting"){ 
     sendResponse({thetable:localStorage.getItem('thetable')}); 
     chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
      if(request.dom){ 
       localStorage.setItem('thedom',request.dom); 
      } 
     }); 
    } 
}); 
  • 如果等待的請求已經到來,:等待是由內容腳本,送回來的ID( 「table_7」):通過popup.js將table_7保存到localStorage中,在發回id(thetable)後,代碼偵聽響應,如果響應已到,則將其保存到localStorage。在此之後,「table_7」的DOM被保存。

完成工作,我在popup.js中處理數據。 :現在的數據是localStorage('thedom')

相關問題