小编典典

如何修改另一个函数收到的XMLHttpRequest响应文本?

ajax

我正在尝试修改无法修改的函数收到的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:猴子补丁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 here}}();


EDIT4 :我已经更改了接受的答案,因为AmmarCSE的问题和jfriend00的答案没有任何复杂性。

简而言之,最佳答案如下:

侦听您想要修改的任何请求(请确保您的侦听器会在原始函数目标之前侦听该请求,否则在使用响应后便没有必要对其进行修改)。

将原始响应(如果要修改)保存在一个临时变量中

将您要修改的属性更改为“ writable:true”,它将擦除其具有的任何值。就我而言

Object.defineProperty(event, 'responseText', {
    writable: true
});

event通过侦听xhr请求的loador readystatechange事件返回的对象在哪里

现在,您可以为响应设置任何所需的内容,如果您只想修改原始响应,则可以使用临时变量中的数据,然后将修改保存在响应中。


阅读 454

收藏
2020-07-26

共1个答案

小编典典

一种非常简单的解决方法是更改responseText自身的属性描述符

Object.defineProperty(wrapped, 'responseText', {
     writable: true
});

因此,您可以XMLHttpRequest

(function(proxied) {
    XMLHttpRequest = function() {
        //cannot use apply directly since we want a 'new' version
        var wrapped = new(Function.prototype.bind.apply(proxied, arguments));

        Object.defineProperty(wrapped, 'responseText', {
            writable: true
        });

        return wrapped;
    };
})(XMLHttpRequest);

演示版

2020-07-26