Я пытаюсь изменить responseText, полученный функцией, которую я не могу изменить. Эта функция создает XMLHttpRequest, к которому я могу подключиться, но я не смог "обернуть" responseText таким образом, чтобы я мог изменять содержимое до того, как его получит оригинальная функция.
Здесь полная оригинальная функция:
function Mj(a, b, c, d, e) {
function k() {
4 == (m && 'readyState' in m ? m.readyState : 0) && b && ff(b) (m)
}
var m = new XMLHttpRequest;
'onloadend' in m ? m.addEventListener('loadend', k, !1) : m.onreadystatechange = k;
c = ('GET').toUpperCase();
d = d || '';
m.open(c, a, !0);
m.send(d);
return m
}
function ff(a) {
return a && window ? function () {
try {
return a.apply(this, arguments)
} catch(b) {
throw jf(b),
b;
}
} : a
}
Я также пытался манипулировать функцией reiceiving k(); в попытке достичь моей цели, но поскольку он не зависит от каких-либо данных, передаваемых функции (например, k (a.responseText);), я не имел успеха.
Есть ли способ, которым я могу это достичь? Я не хочу использовать js-библиотеки (например, jQuery);
EDIT. Я понимаю, что я не могу изменить .responseText напрямую, поскольку он доступен только для чтения, но я пытаюсь найти способ изменить контент между ответом и функцией приема.
EDIT2. Добавлен ниже один из методов, которые я пытался перехватить и изменить .responseText, который был добавлен здесь: Патч обезьяны XMLHTTPRequest.onreadystatechange
(function (open) {
XMLHttpRequest.prototype.open = function (method, url, async, user, pass) {
if(/results/.test(url)) {
console.log(this.onreadystatechange);
this.addEventListener("readystatechange", function () {
console.log('readystate: ' + this.readyState);
if(this.responseText !== '') {
this.responseText = this.responseText.split('&')[0];
}
}, false);
}
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
EDIT3: я забыл включить, что функции Mj и ff недоступны глобально, они оба содержатся внутри анонимной функции (function() {функции здесь})();
EDIT4. Я изменил принятый ответ, потому что у AmmarCSE нет никаких проблем и сложностей, связанных с ответом jfriend00.
Лучший ответ, объясненный кратко, выглядит следующим образом:
Прослушайте какой-либо запрос, который вы хотите изменить (убедитесь, что ваш прослушиватель перехватит его до того, как будет выполняться исходная функция, иначе нет смысла изменять его после того, как ответ уже был использован).
Сохранить исходный ответ (если вы хотите его изменить) во временной переменной
Измените свойство, которое вы хотите изменить, на "writeable: true", оно удалит любое значение, которое оно имело. В моем случае я использую
Object.defineProperty(event, 'responseText', {
writable: true
});
Где event
- объект, возвращенный при прослушивании события load
или readystatechange
запроса xhr
Теперь вы можете установить все, что хотите для своего ответа, если все, что вам нужно, это изменить исходный ответ, тогда вы можете использовать эти данные из своей временной переменной и затем сохранить изменения в ответе.