我会尽力解释我的问题,但如果我是诚实的,我可能会对自己感到困惑,所以我无法想象它对你来说会更容易人
是的,我正在为我经常访问的网站的用户脚本创建一个脚本。我试图做的是劫持任何ajax请求,我做得很好,然后修改responseText。
我似乎无法写入responseText,我可以很好地阅读它并且显示反应很好,但无论我尝试什么,我都无法改变它的价值。
我在控制台中没有出现任何错误,我在代码中留下了评论,以显示日志的内容。
我只是要废弃它但是知道我,我已经错过了一些愚蠢的东西而且看不到它。
提前致谢。
(function(send) {
XMLHttpRequest.prototype.send = function(data) {
this.addEventListener('readystatechange', function() {
if(typeof data == 'string'){
if(data.indexOf('room.details_1') > -1){
if(this.readyState == 4 && this.status == 200){
console.log('Before: ' + JSON.parse(this.responseText).body.user.profile.username); // Shows NameNumber1
var temp = JSON.parse(this.responseText);
temp.body.user.profile.username = 'NameNumber2';
this.responseText = JSON.stringify(temp);
console.log('Temp: ' + temp.body.user.profile.username); // Shows NameNumber2
console.log('After: ' + JSON.parse(this.responseText).body.user.profile.username); // Shows NameNumber1 <-- This is the problem.
console.log(this); // Shows the XMLHttpRequest object, with the original responseText rather than the modified one.
}
}
}
}, false);
send.call(this, data);
};
})(XMLHttpRequest.prototype.send);
答案 0 :(得分:3)
我知道这已经太晚了3年,但我已将其包含在此处,以供其他遇到此主题的人使用。我之前已经完成了这个...这是我的脚本直接复制和粘贴。您应该能够将responseText更改为可写。
Object.defineProperty(this, "responseText", {writable: true});
this.responseText = '{"success":true}';
答案 1 :(得分:2)
XMLHttpRequest.responseText
是ReadOnly。这意味着没有setter,因此您无法修改其值。除了覆盖XMLHttpRequest
本身之外,没有解决方法。
修改强>
测试使用Object.defineProperty
覆盖responseText
:
var xhr = new XMLHttpRequest();
Object.defineProperty( xhr, "responseText", { value: "test" });
xhr.responseText // returns ""
所以这不会起作用
答案 2 :(得分:0)
这对我来说很有用:
var request = new XMLHttpRequest();
delete request.responseText;
request.responseText = 'test';
request.responseText; // returns 'test'