Получить и изменить содержимое XMLHttpRequest - PullRequest
7 голосов
/ 26 мая 2011

Я работаю над плагином для браузера Firefox, Safari, Chrome, который будет перехватывать данные на странице, запускать их с регулярным выражением, а затем, если он совпадет, переформатировать.У меня это работает при загрузке страницы, используя:

var meth = {
  replaceInElement : function(element, find, replace) {
        // iterate over child nodes and replace
  },
  run : function(evt){
    // doc is the document that triggered "run" event
    if (!(evt.target.nodeName === "#document")) { return; }
    var doc = evt.target; // document that triggered "onload" event
    if (!(doc instanceof HTMLDocument)) { return; }
    if (!doc.location) { return; }

    // perform substitutions on the loaded document
    var find = /regex/gi

    meth.replaceInElement(doc.body, find, function(match) {
        var new_content;
        //do stuff
        return new_content;
    });

    //content.document.addEventListener('DOMNodeInserted', ezcall.node_inserted, false);
  }
}

window.addEventListener("load", meth.run, false);

Это работает для статических страниц, но для любого, использующего вызовы ajax, это не удается.Я не могу найти правильного слушателя или выяснить, как перехватить XMLHttpRequest.

Я пробовал подобные прослушиватели событий для XMLHttpRequest без удачи.

XMLHttpRequest.addEventListener('load', meth.run, false);

Я хотел бы либо перехватить запроси измените содержание.Или найдите цель, которая была обновлена, и отсканируйте ее после завершения вызова ajax.

ОБНОВЛЕНИЕ:

Я приму ответ, который говорит, что это невозможно, но мне понадобятся некоторые вспомогательные данныепочему это не может быть сделано.

Ответы [ 3 ]

10 голосов
/ 02 июня 2011

Довольно грязно, но я думаю, что вы можете перезаписать XMLHttpRequest.prototype.open, если вам это нужно только для работы на FF и WebKit.Вот страница Демо .

(function() {
    // save reference to the native method
    var oldOpen = XMLHttpRequest.prototype.open;
    // overwrite open with our own function
    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
        // intercept readyState changes
        this.addEventListener("readystatechange", function() {
            // your code goes here...
            console.log("Interception :) " + this.readyState);
        }, false);
        // finally call the original open method
        oldOpen.call(this, method, url, async, user, pass);
    };
})();

После этого вы можете делать все, что я думаю.Замените instance.readystatechange, замените instance.addEventListener или прослушайте события мутации (хотя они устарели ).

1 голос
/ 27 мая 2011

Я не думаю, что вы можете сделать это, и даже если бы вы могли, есть другие способы загрузки содержимого aysnc, такие как JSON-P

Другой вариант - настроить функцию, которая контролируетэлемент body для любых новых дополнений к DOM.Я не думаю, что это родное событие браузера, поэтому вам придется опросить с помощью setTimeout ().Также обратите внимание, что перебор всех элементов DOM может занимать много времени.На следующей странице есть некоторые события, которые могут помочь: http://www.quirksmode.org/dom/events/index.html

0 голосов
/ 26 мая 2011

Я не думаю, что вы сможете сделать это в общем. Помните, что вызовы ajax могут быть в любом формате (html, xml, json и т. Д.), А затем инициирующий их javascript может делать с данными все, что захочет, прежде чем вставить их в документ. Вы не можете реально контролировать это, если вы не делаете это для конкретного случая, когда вы знаете, что искать. Или чисто грубой силой, где вы отслеживаете содержимое страницы и проверяете, что что-то изменилось через регулярные промежутки времени.

...