Chrome扩展 - 覆盖.js文件

6

有一个网站在JS文件中存在某个bug。JS文件只被引用了一次:

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

我已经下载了JS文件并修复了漏洞。我是否可以通过Chrome扩展程序覆盖/r/js/no-closure/dialogs.js,使用我的dialogs_fixed.js

我已经尝试过(在background.js中):

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

没运气。


你能解决这个问题吗?如果可以的话,能分享一下你的解决方案吗? - undefined
3个回答

7

您不需要使用实验性的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);

将此代码放入一个内容脚本中,以针对您感兴趣的页面进行定位。 并确保通过添加...使此内容脚本在页面加载之前加载。

"run_at" : "document_start"

将以下内容添加到您的内容脚本字段中:

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

编辑 需要注意的是,从Chrome 17开始,Web请求API不再是实验性的,是进行重定向的好方法。


请注意,“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
有一个Firefox的替代品:http://webmynd.wordpress.com/2011/04/04/equivalent-to-beforeload-event-for-firefox-extensions/ - BeauCielBleu
3
编辑:Chrome 浏览器已经移除了 "beforeload" 事件 :( https://code.google.com/p/adblockforchrome/issues/detail?id=6596 - BeauCielBleu

5

你应该可以使用实验性的 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

1

除了在源代码中更改属性之外,另一种方法是拦截javascript文件的请求并返回您的新文件。

您可以使用Requestly中的重定向规则来实现:

  1. 在Chrome开发工具中打开网络选项卡,搜索该文件的请求。复制请求的源URL。
  2. 安装Requestly扩展程序。转到app.requestly.io并创建一个新的重定向规则
  3. 为规则命名,并将先前复制的URL粘贴为请求URL
  4. 运行本地服务器以提供您的固定javascript文件,并在“重定向到”旁边输入本地端点

redirect rule

如果您不想设置本地服务器,则Requestly让您轻松构建端点以提供文件甚至设置,并为您提供可在第4步中使用的端点

使用Requestly模拟服务来提供您的文件

  1. 单击侧面板中的Mock Files
  2. 单击创建新的Mock并选择Mock JS
  3. 给它一个名称,粘贴您的“fixed”javascript文件的内容并创建模拟。

现在,您可以复制端点或在构建规则时单击从模拟服务器中选择


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接