Расширение Chrome, которое запускает код при выполнении ajax-запросов

Итак, чтобы дать основное описание моей проблемы.

У меня есть расширение, которое работает прямо сейчас (наконец), которое обертывает phonenumbers в типе тега.

Он работает прямо сейчас, но у меня проблема со всем, что динамически загружается через JS на основе действия пользователя или на основе аякс-запросов

Например, если я нажимаю письмо hotmail и открываю его, то работает script, но только при обновлении страницы, чтобы почта загружалась и вызывала мой текст.

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

Если в Chrome есть способ прослушать ajax-запросы (которые, кажется, есть) http://code.google.com/chrome/extensions/webRequest.html Это то, что я хочу сделать, но я не уверен, как это реализовать. Я рассматриваю его как слушателя?

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

Anyhelp или даже указатель в правильном направлении будет большим =)

Пожалуйста, будьте добры, если это глупый вопрос, я обещаю, что я искал Google и искал формы для ответа, и я не могу найти ничего. Возможно, я не знаю достаточно, чтобы задать правильный вопрос. Я использую javascript уже около двух недель... так что моя кривая обучения была грубой.

Ответ 1

Когда вы говорите...

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

... где вы используете Mutation Events или Mutation Observer? Потому что я думал, что Наблюдатели должны это исправить. Ive никогда ничего не делал с Наблюдателями раньше и использовал Краткое описание мутаций. Он, казалось, мог делать то, что вам нужно, за исключением того, что он не начал наблюдать, пока документ не был готов/неактивен (не уверен, что), поэтому вам, возможно, придется выполнить сканирование документа, а затем запустить наблюдателя. Вот как выглядел мой тестовый код (в содержании script)...

handleChanges = function(summaries) {
    // There may be more things to ignore
    var ignore = {
        SCRIPT: true,
        NOSCRIPT: true, 
        CDATA: true,
        '#comment': true
    }
    summaries.forEach(function(summary) {
        summary.added.forEach(function(node) {
            if (!ignore[node.nodeName] || (node.parentNode && !ignore[node.parentNode.nodeName]) && node.nodeValue.trim()) {
                node.nodeValue='PAEz woz ere - '+node.nodeValue;
            }
        })
    })

}

var observer = new MutationSummary({
    callback: handleChanges,
    // required
    rootNode: document,
    // optional, defaults to window.document
    observeOwnChanges: false,
    // optional, defaults to false
    queries: [{
        characterData: true
    }]
});

И еще один способ проверить XMLHttpRequest - захватить его, просто он может выглядеть (в контенте script при начале документа).....

function injectScript(source) {

    var elem = document.createElement("script"); //Create a new script element
    elem.type = "text/javascript"; //It javascript
    elem.innerHTML = source; //Assign the source
    document.documentElement.appendChild(elem); //Inject it into the DOM
}

injectScript("("+(function() {

    function bindResponse(request, response) {
        request.__defineGetter__("responseText", function() {
            console.warn('Something tried to get the responseText');
            console.debug(response);
            return response;
        })
    }

    function processResponse(request,caller,method,path) {
        bindResponse(request, request.responseText);
    }

    var proxied = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function(method, path, async) {
            var caller = arguments.callee.caller;
            this.addEventListener('readystatechange', function() {
                if (this.readyState === 4)
                    processResponse(this,caller,method,path);
            }, true);
        return proxied.apply(this, [].slice.call(arguments));
    };
}).toString()+")()");

..., который я узнал на мега-потрясающем Ужин Счастливый блог блога.
Но, как вы, вероятно, знаете сейчас, этого недостаточно для сайтов, управляемых ajax. Обычно вам нужно написать что-то конкретное для сайта или, возможно, Mutation Observer будет отвечать вашим потребностям.