Ответ 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 будет отвечать вашим потребностям.