1

Chrome 拡張機能を作成していて、background.js で関数を呼び出したいと考えています。

これは機能です:

function getUrlVars(url) {
  var vars = {};
  var parts = url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
    if(vars[key]){
      if(vars[key] instanceof Array)
        vars[key].push(value);
      else
        vars[key] = [vars[key], value];
    }else
      vars[key] = value;
  });
  return vars;
}

URLのパラメータを返します。この関数をbackground.jsに入れましたが、呼び出すと動作しません。ここで関数を呼び出します。

chrome.webRequest.onBeforeRequest.addListener(function(details){ 
  chrome.tabs.get(details.tabId, function (tab) { 
    source=getUrlVars(details.url)[iapisource];
    id=getUrlVars(details.url)[iapiid];
    redirectUrl=tab.url+"?iapisource="+source+"&iapiid="+id;
  });
  return {cancel : true , redirectUrl : redirectUrl}; 
},
// block requests matching this url
{urls: ["*://*/*iapisource*iapiid*"]},["blocking"]);

ここでは、リクエストの前に URL を取得し、それに新しい URL のパラメーターを追加します。

関数をどこに置く必要があり、どのように呼び出すことができますか?

4

2 に答える 2

2

魚をあげることもできますが、代わりに魚の釣り方を教えます。

1)コードが機能しない場合は、コードをデバッグする必要があります。StackOverflow はオンライン デバッガーではありません。

chrome://extensions/ に移動し、拡張機能を見つけて、背景ページをクリックし、[コンソール] タブに移動して、そこに表示されるエラーを調査します。

2)これの代わりに1つのこと:

source=getUrlVars(details.url)[iapisource];

あなたが望んでいたのはこれだと思います:

source=getUrlVars(details.url)['iapisource'];

またはさらに良い:

var params = getUrlVars(details.url);
var redirectUrl = tab.url+"?iapisource=" + params.iapisource + "&iapiid=" + params.iapiid;

3)コールバック関数は、tabs.getサーバーから戻った後にのみ実行されます。onBeforeRequest

// 1.
chrome.webRequest.onBeforeRequest.addListener(function(details){  
    // 2.
    chrome.tabs.get(details.tabId, function (tab) { 
      // 4.
      source=getUrlVars(details.url)[iapisource];
      id=getUrlVars(details.url)[iapiid];
      redirectUrl=tab.url+"?iapisource="+source+"&iapiid="+id;
    });
    // 3.
    return {cancel : true , redirectUrl : redirectUrl}; // redirectUrl is undefined!
  }, 
  {urls: ["*://*/*iapisource*iapiid*"]},
  ["blocking"]
);
于 2013-05-21T08:58:10.977 に答える
1

を使用して、通常はバックグラウンド ページにグローバル関数が含まれるバックグラウンド ページextension.getBackgroundPageのオブジェクトにアクセスできます。window

この問題については、ここでさらに説明します。

それができない場合は、メッセージ パッシングを調べる必要があります。

于 2013-05-20T13:05:29.190 に答える