chrome扩展程序:已加载页面的事件和更新网址

时间:2016-07-26 14:39:20

标签: javascript google-chrome-extension

我想更改chrome中当前标签的网址并重新加载页面。 我尝试了这段代码,但没有用,任何帮助都会非常感激。

background.js:

function updateUrl(){

    chrome.tabs.getCurrent(function (tab) {

        var tabUrl = encodeURIComponent(tab.url);

        var myNewUrl = tabUrl + "some text";

        chrome.tabs.update(tab.id, {url: myNewUrl});
   })
}

chrome.tabs.onUpdated.addListener( function (tabId, changeInfo, tab) {
    if (changeInfo.status == 'complete') {

        updateUrl();

    }
})

的manifest.json:

{
  "name": "test",
  "version": "0.1",
  "manifest_version": 2,

  "permissions": [
    "tabs",
    "webNavigation",
    "http://www.example.com/*"
  ],

  "background": { "scripts": ["background.js"] },

  "content_scripts":
  [
    {
      "matches": ["http://www.example.com/*"], 
      "js":  ["background.js", "jquery.js"]
    }
  ] 
}

2 个答案:

答案 0 :(得分:1)

从您的清单中看起来您正在尝试将background.js包含为内容脚本和后台脚本。内容脚本中无法使用chrome.tabs,因此无法使用。

根据您的具体使用情况,如果您要附加特定网址,则可以使用chrome.webRequest API来实现此目标。

background.js:

chrome.webRequest.onBeforeRequest.addListener(function (details) {
    return {
        redirectUrl: details.url + "some text"
    }
}, {
    urls: ["http://www.example.com/*"]
}, ["blocking"]);

manifest.js:

{
  "name": "test",
  "version": "0.1",
  "manifest_version": 2,
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "http://www.example.com/*"
  ],
  "background": { 
    "scripts": [
      "background.js"
    ] 
  }
}

这将添加"一些文字"浏览器向" http://www.example.com/ *"的每个请求结束

如果您确实想使用内容脚本执行此操作,那么您需要查看message passing。这将允许您从内容脚本中调用后台脚本(可以使用chrome.tabs)。邮件发送后,后台页面可以更新选项卡。

答案 1 :(得分:0)

  1. chrome.tabs.getCurrent用于获取制作此脚本的选项卡。如果从非标签上下文调用,它将返回undefined(例如:背景页或弹出视图)。

    由于你在chrome.tabs.onUpdated处理程序中有了标签,你可以直接使用它而无需再次检索它。

    function updateUrl(tabId, tabUrl){
        var myNewUrl = encodeURIComponent(tabUrl) + "some text";
        chrome.tabs.update(tabId, {url: myNewUrl});
    }
    
    chrome.tabs.onUpdated.addListener( function (tabId, changeInfo, tab) {
        if (changeInfo.status == 'complete') {
            updateUrl(tab.id, tab.url);
        }
    });
    
  2. 从你manifest.json开始,background.js用于后台页面和内容脚本,这是一个糟糕的设计,虽然不是这个的根本原因题。

    如果你可以把逻辑划分为两部分,最好是用来操纵当前网页DOM的内容脚本和用于扩展相关事物的背景页面,这样会更好。