当前位置: 首页 > 面试题库 >

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

鲁华皓
2023-03-14
问题内容

我正在尝试修改无法修改的函数收到的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事件返回的对象在哪里

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


问题答案:

一种非常简单的解决方法是更改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);

演示版



 类似资料:
  • 问题内容: 我想知道如何使用XMLHttpRequest加载远程URL的内容,并将所访问站点的HTML存储在JS变量中。 说,如果我想加载并Alert()的HTML,我该怎么做? 问题答案: 您可以在等于时得到它。 这是一个示例(与IE6 / 7不兼容)。 为了获得更好的跨浏览器兼容性,不仅可以与IE6/7兼容,而且还可以解决某些浏览器特定的内存泄漏或错误,并且为了降低触发Ajaxical请求的冗

  • 我定义了两个java类test1和test2,其中在test1中定义了一个变量,然后在connect()方法中改为,我使用使程序不退出。但是当我在test2中调用时,得到的值仍然是初始值而不是。我应该使用什么方法来获取的修改值?

  • 我是java多线程编程的新手。我知道它可以通过线程通信来完成,但我不知道如何继续。我不知道如果在文件中进行了一些更改,一个线程将如何通知另一个线程。问题在下面提到。 我有一个逗号分隔的文件,其中写入了一些行。我希望从我的主线程启动两个线程。csv文件可能会附加到外部/手动。如果csv文件中做了一些更改,其中一个线程将通知第二个线程,第二个线程将逐行并发读取该文件并执行一些任务。 谢谢

  • 我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说是一个问题。在下面的此示例代码中,我想通过使用函数“changeNum”来修改变量“num”的值。但是,当然,科特林不允许我修改它。我该如何解决这个问题?如何使用“更改数字”函数来修改变量“num”?

  • 问题内容: 我对iOS应用程序开发非常陌生,并且从服务器收到以下响应: 请任何人帮助我了解如何在我的应用程序中使用员工ID和员工姓名。 问题答案: 您的JSON数据看起来像“嵌套JSON”,这意味着您必须将其反序列化两次。 第一个反序列化从您的JSON数据中提取一个字符串: 现在是字符串 再次是JSON数据。第二个反序列化提取数组: 现在您可以像访问它

  • 问题内容: 抱歉,我确定一个基本问题,但似乎无法弄清楚。 说我有这个程序,文件名为: 如何在另一个程序中调用它?我试过了: 而不是“ hello world”,我得到了……过去我通过将第一个文件设为类来做到这一点,但我想知道如何正确导入该函数?如果有帮助,我会在我的真实文件中打印字典 问题答案: 您需要打印调用函数的结果,而不是函数本身: 另外,您可以省略子句,而不是: 如果更方便,也可以使用: