3

我正在使用以下代码挂钩 XMLHttpRequest 打开/发送方法:

var lastParams = '';
var send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data){
   lastParams = data;
   send.call(this, data);
};

var open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, uri, async, user, pass) {
    this.addEventListener("readystatechange", function(event) {  
    if(this.readyState == 4){
       var self = this;
       var response = {
         method: method,
         uri: uri,
         params: lastParams,
         responseText: self.responseText
      };
      console.log(response);  
    }
  }, false);
  open.call(this, method, uri, async, user, pass);
};

在一次单个ajax请求的情况下它工作正常。

当一次触发多个 ajax 请求时,lastParams 可能包含错误的数据(意味着 lastParams 可能包含来自其他 ajax 请求的数据)。我想将 lastParams 与请求的其他属性唯一关联吗?

XMLHttpRequest 中是否有任何 id 属性,以便我可以唯一标识 ajax 请求实例?

提前致谢。

4

3 回答 3

2

看看https://github.com/jpillora/xhook演示

//modify 'responseText' of 'example2.txt'
xhook.after(function(request, response) {
  if(request.url.match(/example\.txt$/)) {
    response.text = response.text.replace(/[aeiou]/g,'z');
  }
});
于 2013-08-28T14:38:02.577 回答
1

为了将某些数据与指定的 XMLHttpRequest 实例唯一关联,您可以简单地将属性添加到 XMLHttpRequest 实例中并将数据保存到属性中。例如:

// generating data for request
var data=generateData();

// sending data
var xhr=new XMLHttpRequest();
xhr.open("POST","/yourpage.php",true);
xhr.onreadystatechange=function(event){
  if(this.readyState===4){
    console.log(this.mySendedData);
  }
};
/** if you need to preserve 'data' variable value for each xhr **/
xhr.mySendedData=data;
/***************************************************************/
xhr.send(data);
于 2012-05-07T09:22:58.703 回答
0

为什么不将“lastParams”作为一个数组,并且您总是推送数据,而不是每次都覆盖它。

于 2012-05-07T09:29:24.470 回答