我正在尝试修改我无法修改的函数接收到的 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 的答案相关的问题和复杂性。
简短解释的最佳答案如下:
监听你想要修改的任何请求(确保你的监听器会在原始函数目标之前拦截它,否则在响应已经被使用后修改它是没有意义的)。
将原始响应(如果你想修改它)保存在一个临时变量中
将您要修改的属性更改为“可写:真”,它将删除它具有的任何值。就我而言,我使用
Object.defineProperty(event, 'responseText', {
writable: true
});
其中 event
是监听xhr请求的 load
或 readystatechange
事件返回的对象
现在您可以为响应设置任何您想要的内容,如果您只想修改原始响应,那么您可以使用临时变量中的数据,然后将修改保存在响应中。
原文由 Shadow 发布,翻译遵循 CC BY-SA 4.0 许可协议
一个非常简单的解决方法是更改
responseText
本身的属性描述符所以,你可以扩展
XMLHttpRequest
比如演示