1

Я хотел бы запустить функцию, когда сайт выполняет запрос XHR. Я провел всю ночь, пытаясь решить эту проблему. И я пробовал много предложений, размещенных в stackoverflow, но, похоже, это не работает для моего usercript. Поэтому я решил сам спросить. Надеюсь, вы можете помочь.Обнаружить запрос XHR

Функция, которую я хочу использовать, использует GM_setValue и GM_getValue, поэтому это также затрудняет задачу. Я также пробовал функцию ниже и подобные функции, но она работает только при ее использовании в консоли JavaScript. Когда я использую его с usercript, он больше не работает ... Я также пробовал waitForKeyElements, но это, похоже, не работает для меня. И setTimeout и setInterval на самом деле не вариант. Пожалуйста, помогите. Заранее спасибо!

var oldXHR = window.XMLHttpRequest; 
function newXHR() { 
    var realXHR = new oldXHR(); 
    realXHR.addEventListener("readystatechange", function() { 
     if(realXHR.readyState==4 && realXHR.status==200){ 
      afterAjaxComplete() //run your code here 
     } 
    }, false); 
    return realXHR; 
} 
window.XMLHttpRequest = newXHR; 

ответ

2

Override по умолчанию XMLHttpRequest методы с пользовательскими из них, и поймать необходимые события:

var open = window.XMLHttpRequest.prototype.open, 
    send = window.XMLHttpRequest.prototype.send; 

function openReplacement(method, url, async, user, password) { 
    this._url = url; 
    return open.apply(this, arguments); 
} 

function sendReplacement(data) { 
    if(this.onreadystatechange) { 
    this._onreadystatechange = this.onreadystatechange; 
    } 
    this.onreadystatechange = onReadyStateChangeReplacement; 
    return send.apply(this, arguments); 
} 

function onReadyStateChangeReplacement() { 

    //YOUR CODE FOR READYSTATECHANGE 

    if(this._onreadystatechange) { 
    return this._onreadystatechange.apply(this, arguments); 
    } 
} 

window.XMLHttpRequest.prototype.open = openReplacement; 
window.XMLHttpRequest.prototype.send = sendReplacement; 

Update: read this post для получения дополнительной информации о подходе и примеры.

+0

Спасибо! Сначала это работало, но, к сожалению, все еще есть некоторые проблемы. Когда есть несколько запросов XHR, моя функция вызывает только вызовы после первого. (Не большая проблема) И, похоже, он не обнаруживает изменения страницы после запроса XHR. Например, я использую этот кусок кода в своей функции: 'document.documentElement.innerHTML.match (/ xxx/g)' Но он не обнаруживает новые совпадения, добавленные запросом XHR. – Royalgamer06

+1

@ Royalgamer06 Хорошо, что он отлично работает в моем рабочем приложении. Какие проблемы? –

+0

Извините, я нажал кнопку ввода, прежде чем я закончил писать. Проверьте первый комментарий. – Royalgamer06

Смежные вопросы