Розширення Chrome - замінити файл .js

Є веб-сайт, який має певну помилку у файлі JS. Файл 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");

Нещастить.

4

2 Відповіді

Для цього вам не потрібно використовувати експериментальний веб-запит, ви можете просто скористатися подією 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

EDIT Altho it should be noted that as of Chrome 17 the web request api is no longer experimental and is a great way to do redirects.

5
додано
Зауважте, що подія "перед завантаженням" підтримується лише браузерами Webkit (Chrome, Safari): developer.apple.com/library/safari/documentation/Tools/… (перегляньте" Блокування небажаного вмісту ")
додано Автор BeauCielBleu, джерело
Існує альтернатива для Firefox: webmynd.wordpress.com/2011/04/04/ …
додано Автор BeauCielBleu, джерело
Редагувати: подія "beforeload" була вилучена з chrome :( code.google .com/p/adblockforchrome/issues/detail? id = 6596
додано Автор BeauCielBleu, джерело

Ви повинні мати змогу заблокувати його за допомогою експериментального webRequest api:

chrome.experimental.webRequest.onBeforeRequest.addListener(function(details) { 
    return {cancel: true}; 
}, {urls: ["http://www.example.com/r/js/no-closure/dialogs.js"]}, ["blocking"]);
4
додано
Не могли б ви оновити свою відповідь, оскільки вона вже не експериментальна?
додано Автор Xan, джерело