我会尽力解释我的问题,但是老实说,我有点困惑,所以我无法想象这对你们会容易得多。

正确,我正在为我经常访问的网站的用户脚本创建脚本。我想做的是劫持任何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);

最佳答案

XMLHttpRequest.responseText是只读的。这意味着没有设置器,因此您无法修改其值。除了替代XMLHttpRequest本身,没有其他解决方法。

Specification

编辑
测试使用Object.defineProperty覆盖responseText的建议:

var xhr = new XMLHttpRequest();
Object.defineProperty( xhr, "responseText", { value: "test" });
xhr.responseText // returns ""


所以这也不行

关于javascript - 覆盖XMLHttpRequest.responseText,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23901337/

10-12 07:28