0

manifest.json、content.js、background.js で構成される chrome 拡張機能を作成しました。content.js で現在のタブの URL を抽出し、background.js で新しいタブを開きます。私がやりたいことは、コンテンツから URL を渡し、それをバックグラウンドで呼び出している URL に追加することです。

content.js:

chrome.extension.onMessage.addListener(function(request, sender, sendResponse)
{
    if(request.greeting=="gimmieyodatas")
    {
    var output ="URL=";
    //check for the character '?' for any parameters in the URL
    var paramIndex = document.URL.indexOf("?");
    //if found, eliminate the parameters in the URL
    if (paramIndex > -1)
    {
        output += document.URL.substring(0, paramIndex);
    };
        sendResponse({data: output});
    }
    else{
        sendResponse({}); 
    }
});

background.js:

var output2;
chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendMessage(tab.id, {greeting:"gimmieyodatas"}, function(response) {
    output2 = response.data;
  });
});
chrome.browserAction.onClicked.addListener(function() {
    chrome.tabs.create({url: "http://www.google.com?" + output2}, function(tab) {
        chrome.tabs.executeScript(tab.id, {file: "content.js"}, function() {
            sendMessage();
        });
    });
});

開いているタブから拡張機能を実行すると、新しいタブで Google が開きますが、現在のタブの URL が Google URL に追加されないため、「出力」データが background.js に渡されません。私は何を間違っていますか?

4

1 に答える 1

4

問題は、新しいタブが開かれたときにメッセージを送信するようにバックグラウンド ページに指示していないことです。chrome.tabs.getSelected の呼び出しは、拡張機能が最初に実行されたときに 1 回だけ行われます。新しいタブが開かれるたびに行われるわけではありません。

バックグラウンド ページを 2 つのコンテンツ ページ間の仲介として使用することで正しい軌道に乗っていますが、別のアプローチをお勧めします。

マニフェスト ファイルを介して、新しいタブが開かれるたびにコンテンツ スクリプトを読み込みます。

"content_scripts": [
    {
        "matches" : [
            "<all_urls>"
        ],
        "js" : [
            "content.js"
        ]
    }
],

現在の URL ページが読み込まれるとすぐに、メッセージをバックグラウンドに送信するだけの、はるかに単純なコンテンツ スクリプトを使用します。

(content.js)

var paramIndex = document.URL.indexOf('?');
if (paramIndex > -1) {
    chrome.runtime.sendMessage({output2: 'URL=' + document.URL.substring(0, paramIndex)});
}

バックグラウンド ページがメッセージを受信すると、URL がグローバル変数に保存されます。

(background.js)

var output2;
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
    output2 = request.output2;
});

アクション ボタンがクリックされたときに、その URL を読み込むことができます。

(background.js)

chrome.browserAction.onClicked.addListener(function() {
    chrome.tabs.create({url: "http://www.google.com?" + output2});
});
于 2013-06-21T05:50:30.007 に答える