Chrome扩展程序:如何在开始加载之前更改JS网址

时间:2014-08-26 11:06:36

标签: javascript google-chrome-extension preloading

我想在使用Chrome扩展程序开始加载之前更改js javascript的src。

的manifest.json

{
"name":"Inject DOM",
"version":"1",
"manifest_version":2,
"permissions": [
    "webRequest",
    "webNavigation",
    "http://*/*",
    "https://*/*"
        ],
"content_scripts": [
    {
      "run_at": "document_end",
      "matches": ["http://www.example.com/*"],
      "js": ["inject_this.js"]
    }
  ]
}

inject_this.js

我在各种功能场景中执行此代码

var element = event.srcElement;

if(/production_path/.test(element.src)){

element.src = element.src.replace(/production_url/gi, "dev_path");

}

情景A

document.addEventListener('DOMNodeInserted', nodeInsertedCallback);

情景B

执行此方案到inject_this.js抛出此TypeError:

未捕获的TypeError:无法读取属性' onBeforeRequest'未定义的

在另一个js中执行此操作

chrome.webRequest.onBeforeRequest.addListener(
  function(details) {

    if(/production_url/.test(details.url)){

       return { 
          redirectUrl: details.usl.replace(/production_url/gi, "dev_url")
       }

    }

},

{urls: ["<all_urls>"]},
["blocking"]);

我在哪里放这个代码段?

情景C

document.addEventListener('beforeload', doBeforeLoad , true);

但每次script.src更改太晚时,都会加载资源。

如何在开始加载之前更改javascript网址?

1 个答案:

答案 0 :(得分:1)

您的解决方案B应该有效。

为了实现这一目标,需要满足两个条件:

  1. 此代码应转到background script / event page

  2. 您需要appropriate permissions"webRequest", "webRequestBlocking"

  3. 您可能也不应该在<all_urls>上使用它,因为您的扩展程序似乎特定于单个站点(来自您的清单)。在所有网址上执行此操作会降低您的Chrome浏览器速度并可能导致其他网站崩溃,请考虑使用限制性匹配模式,例如"http://www.example.com/*production_url*"