我正在尝试修改我无法修改的函数接收到的 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
}
我也试图操纵接收函数 k(); 试图达到我的目标,但由于它不依赖于传递给函数的任何数据(例如 k(a.responseText);),我没有成功。
有什么办法可以实现这一目标吗?我不想使用 js 库(例如 jQuery);
编辑:我知道我不能直接更改 .responseText 因为它是只读的,但我试图找到一种方法来更改响应和接收函数之间的内容。
EDIT2:在我尝试拦截和更改从这里添加的 .responseText 的方法之一下面添加:Monkey patch 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(){functions are here})();
EDIT4:我已经更改了接受的答案,因为 AmmarCSE 没有任何与 jfriend00 的答案相关的问题和复杂性。
简而言之,最佳答案如下:
侦听您要修改的任何请求(确保您的侦听器会在原始函数目标执行之前拦截它,否则在响应已被使用后修改它是没有意义的)。
将原始响应(如果要修改)保存在临时变量中
将您要修改的属性更改为“writable: true”,它将擦除它所具有的任何值。在我的情况下,我使用
Object.defineProperty(event, 'responseText', {
writable: true
});
event
监听xhr请求的load
orreadystatechange
事件返回的对象在哪里
现在你可以为你的响应设置任何你想要的,如果你只想修改原始响应,那么你可以使用临时变量中的数据,然后将修改保存在响应中。