2011-10-28 60 views
3

有一个网站在JS文件中有一定的错误。 JS文件只在一个地方被引用:Chrome扩展程序 - 覆盖.js文件

<script type="text/javascript" charset="utf-8" src="/r/js/no-closure/dialogs.js?v=2"></script> 

我已经下载了JS文件并修正了错误。有没有办法通过Chrome扩展程序,用我的dialogs_fixed.js覆盖/r/js/no-closure/dialogs.js

我试过(在background.js):

var script = $('[src*="dialogs.js"]'); 
script.attr("src", "dialogs_patch.js"); 

没有运气。

回答

4

你应该能够与实验webRequest API来阻止它:

chrome.experimental.webRequest.onBeforeRequest.addListener(function(details) { 
    return {cancel: true}; 
}, {urls: ["http://www.example.com/r/js/no-closure/dialogs.js"]}, ["blocking"]); 
+1

你能不能更新你的答案,因为它不再是实验性的? – Xan

5

你不需要使用实验的WebRequest对于这一点,你可以只使用beforeload事件。 像这样的东西应该工作....

String.prototype.endsWith = function(pattern) { 
    var d = this.length - pattern.length; 
    return d >= 0 && this.lastIndexOf(pattern) === d; 
}; 

document.addEventListener('beforeload', function(event) { 
if (event.url.endsWith("/r/js/no-closure/dialogs.js?v=2")){event.srcElement.src=chrome.extension.getURL("dialogs.js");} 
}, true); 

..put,在一个内容脚本针对页面您感兴趣的内容。 并确保您对此内容脚本加载的页面不会加入之前.. 。

"run_at" : "document_start" 

...您的内容脚本场....

http://code.google.com/chrome/extensions/content_scripts.html

编辑 虽然需要注意的是,从Chrome 17开始,web请求API已不再是实验性的,并且是重定向的好方法。

+0

请注意,“beforeload”事件仅受Webkit浏览器(Chrome,Safari)支持:https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW9(观看“阻止不需要的内容”) – BeauCielBleu

+0

Firefox还有一种替代方法:http://webmynd.wordpress.com/2011/04/04/equivalent-to-beforeload-event- for-firefox-extensions/ – BeauCielBleu

+2

编辑:从Chrome浏览器中删除“beforeload”事件:(https://code.google.com/p/adblockforchrome/issues/detail?id=6596 – BeauCielBleu