【发布时间】:2014-10-19 04:34:09
【问题描述】:
我正在尝试修改我无法修改的函数接收到的 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事件返回的对象
现在您可以为响应设置任何您想要的内容,如果您只想修改原始响应,那么您可以使用临时变量中的数据,然后将修改保存在响应中。
【问题讨论】:
-
正如this meta thread 所说,答案不应该是问题的一部分,而应该是他们自己的答案。我已将您的答案移至 to a community wiki answer(因此我无法从中获得代表)并对其进行了编辑。如果您想改写帖子,可以编辑社区 wiki 答案。
-
@MT0 感谢帮助和信息,社区 wiki 的回答听起来不错。
标签: javascript ajax xmlhttprequest monkeypatching