Перехват событий в ajax

Сайт использует Jquery и кучу уже написанных скриптов (не мной), и что то там править совершенно не хочется. По клику на кнопку уходит аякс, а вот с его результатом мне надо "поработать" (условно права на файлы которые есть для меня 0444).

Может есть какой нибудь глобальный объект (такого не нагуглил), с обработчиками для сетевых событий? Есть возможность перехватить onload? Или какие есть еще варианты решения?


Ответы (1 шт):

Автор решения: Jarry Roxwell

Статья на Хабре натолкнула меня на идею. Унаследоваться от оригинального класса и заменить его. Знаю так делать не хорошо, но это работает.

(() => {
  class C_XMLHttpRequest extends XMLHttpRequest {
    
    static handlee = {};
    static original;

    constructor() {
      super();
      
      self;

      return new Proxy(this, {
        get: (target, prop, receiver) => {
          return typeof target[prop] == 'function' ? target[prop].bind(target) : target[prop];
        },
        set: (target, prop, val, receiver) => {
          if(C_XMLHttpRequest.handlee.hasOwnProperty(prop))
            target[prop] = () => {
              C_XMLHttpRequest.handlee[prop].call(this, ...arguments);
              val( ...arguments);
            }   
          else
          target[prop] = val;

          return true;
        }
      });
    }
  }

  C_XMLHttpRequest.original = XMLHttpRequest;
  window.XMLHttpRequest = C_XMLHttpRequest;
})();

(() => {
  window.XMLHttpRequest.handlee.onload = function(){
    console.log(`Хехех, перехватил ${this.response.length} байт`);
  }
})();

(() => {
  let xhr = new XMLHttpRequest();

  xhr.open('GET', '/');
  xhr.send();
  xhr.onload = function() {
    if (xhr.status != 200) {
      console.log(`Ошибка ${xhr.status}: ${xhr.statusText}`);
    } else {
      console.log(`Готово, получили ${xhr.response.length} байт`);
    }
  };
})();
→ Ссылка