Javascript 如何将background.js中的自定义函数用于Chrome扩展?

Javascript 如何将background.js中的自定义函数用于Chrome扩展?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在编写一个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[k

我正在编写一个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的参数附加到其中

我必须将函数放在何处以及如何调用它?

您可以使用来访问后台页面的
窗口
对象,该对象通常包含后台页面中的全局函数

这一问题有待进一步讨论


如果你做不到,你应该调查一下。

我可以给你一条鱼,但我会教你如何钓鱼

1)如果代码不起作用,您应该调试代码。StackOverflow不是联机调试器

去chrome://extensions/,找到您的扩展,单击您的背景页,转到控制台选项卡并调查您在那里看到的错误

2)为了一件事,而不是为了这个:

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)只有在您已经从
onBeforeRequest返回后,
选项卡.get
回调函数才会运行

// 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"]
);

您是从background.js页面内部还是在扩展中的其他地方调用此函数,例如内容脚本或popup.html?是否可以包含调用的代码?这可能是问题的一部分?因此我将此函数放在background.html中的一个scrbit标记中,我使用extension.getBackgroundPage,然后如何调用该函数?
extension.getBackgroundPage.yourFunction()
它不起作用,因为我不能同时使用background.js和background.htmltime@user2236264我更新了答案来解决这个问题。调查一下,谢谢。对不起,我被这个问题难住了,这让我发疯了。重定向url是define,如果我在返回后加上括号是正确的,但是页面在details.url上,所以它不会重定向。