0

次の問題を解決したい: ポップアップ ウィンドウがあり、そこにpopup.html選択タグがあります:

<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);
            }
        });
    });
} 

この後、コンテンツ スクリプトはリクエストをキャッチし、id で指定された dom を含むレスポンスを 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 は、サイトの innerHTML である必要があり<table id="table_7">ます。それは存在します、私はこれらの要素をすべて作りました。

もう 1 つの追加情報として、選択値を の別のファイルにpopup.js保存し、「table_7」をこのファイルの localStorage に保存します。しかし、localStorage は background.html からも利用できるので問題ないと思います。


流れ:

  • 何かを選択します (fe: 組織ごとに DISPLAY LOGINS)
  • をクリックし"Save Btn"popup.htmlpopup.jstable_7」を localStorage に保存します
  • 次に、[Run Btn] をクリックしてpopup.htmlpopup.js現在のタブをリロードします。

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

    私の contentscript は、タブがリロードされたときにのみ情報を収集するため、これを行います。

  • リロード後、情報(「table_7」)でbackground.htmlリクエストを送信する必要がある と思いますcontentscript

  • contentscript は、サイト fe: から DOM を取得し、document.getElementById("table_7").innerHTMLこれをバックグラウンド ページに送り返します。

問題は、フローを実行すると、このアラートが表示されることです。 ここに画像の説明を入力

この問題を解決する方法を教えてください。:/ ありがとう

4

1 に答える 1

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")を返送します:table_7はpopup.jsによってlocalStorageに保存され、id(thetable)を返送した後、コードは応答をリッスンします、応答があった場合は、localStorageに保存します。この後、「table_7」のDOMが保存されます。

仕事を終えて、私はpopup.jsでデータを処理します。:データは現在localStorage('thedom')

于 2012-05-05T19:14:07.547 に答える