我想在使用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网址?
答案 0 :(得分:1)
您的解决方案B应该有效。
为了实现这一目标,需要满足两个条件:
您需要appropriate permissions:"webRequest", "webRequestBlocking"
您可能也不应该在<all_urls>
上使用它,因为您的扩展程序似乎特定于单个站点(来自您的清单)。在所有网址上执行此操作会降低您的Chrome浏览器速度并可能导致其他网站崩溃,请考虑使用限制性匹配模式,例如"http://www.example.com/*production_url*"