0

我编写了以下脚本来更改 Chrome 中选项卡的 URL,但无法弄清楚如何让它在每个页面上自动运行。

  var nytimes = /.*nytimes\.com.*/;
  var patt = /(&gwh=).*$/;

  function updateUrl(tab){
   if(tab.url.match(nytimes))
   {
    var newUrl = tab.url.replace(patt,"");
    chrome.tabs.update(tab.id, {url: newurl});
   }
  }
 chrome.tabs.onUpdated.addListener(function(tab) {updateUrl(tab);});

我把它放到我的背景页面,但它不起作用。我是否需要将代码放在其他地方才能运行?

4

1 回答 1

1

我强烈建议您阅读内容脚本。它们正是您正在寻找的,但您需要了解它们对 Chrome.* API 的访问权限有限,因此您必须使用消息传递才能使用您当前的功能。但是,通过使用内容脚本,您可能可以使用我提出的解决方案之一来简化此操作。

解决方案 1

假设您希望每次都将重定向发送到相同的 URL,您可以轻松地将扩展配置为仅在 NY Times 站点上运行您的内容脚本。例如;

内容脚本:content.js

location = 'http://example.com';

解决方案 2

但是,如果重定向 URL 可以变化,您可能希望将该逻辑抽象到您的背景页面中。例如;

内容脚本:content.js

// Or you can pass a more specific section of the URL (e.g. `location.pathname`)
chrome.extension.sendRequest({href: location.href}, function(data) {
  location = data.url;
});

背景页面:background.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  sendResponse({
    url: getUrl(request.href) // TODO: `getUrl` method containing your logic...
  });
});

重要的!

无论您采用哪种方法,您还需要请求许可才能在清单文件中的目标站点上运行内容脚本。

显现:manifest.json

{
  ...
  "content_scripts": [
    {
      "js": ["content.js"],
      "matches": ["*://*.nytimes.com/*"],
      "run_at": "document_start"
    }
  ],
  ...
}
于 2012-06-14T08:07:59.497 回答