我正在写一个小的ajax类供个人使用。在课堂上,我有一个发布帖子请求的“帖子”方法。 post方法有一个回调参数。在onreadystatechange属性中,我需要调用回调方法。
这样的事情:
this.requestObject.onreadystatechange = function() {
callback(this.responseText);
}
但是,我无法从自治函数中访问回调变量。如何将回调变量带入onreadystatechange自治函数的范围?
到目前为止,这是完整的代码:
function request()
{
this.initialize = function(errorHandeler)
{
try {
try {
this.requestObject = new XDomainRequest();
} catch(e) {
try {
this.requestObject = new XMLHttpRequest();
} catch (e) {
try {
this.requestObject = new ActiveXObject("Msxml2.XMLHTTP"); //newer versions of IE5+
} catch (e) {
this.requestObject = new ActiveXObject("Microsoft.XMLHTTP"); //older versions of IE5+
}
}
}
} catch(e) {
errorHandeler();
}
}
this.post = function(url,data,callback)
{
var response;var escapedData = "";
if (typeof data == 'object') {
for (i in data) {
escapedData += escape(i)+'='+escape(data[i])+'&';
}
escapedData = escapedData.substr(0,escapedData.length-1);
} else {
escapedData = escape(data);
}
this.requestObject.open('post',url,true);
this.requestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
this.requestObject.setRequestHeader("Content-length", data.length);
this.requestObject.setRequestHeader("Connection", "close");
this.requestObject.onreadystatechange = function()
{
if (this.readyState == 4) {
// call callback function
}
}
this.requestObject.send(data);
}
}
答案 0 :(得分:4)
只需将回调函数与其余参数一起传递
this.post = function(url, data, callback) {
...
this.requestObject.onreadystatechange = function() {
if (this.readyState == 4) {
callback(this.responseText);
}
};
...
}
然后
foo.post("foo.html", {foo:"bar"}, function(result){
alert(result);
});
顺便说一句,这是将数据转换为正确字符串的更好方法
var q = [];
for (var key in data) {
if (data.hasOwnProperty(key)) {
q.push(key + "=" + encodeURIComponent(data[key]));
}
}
data = q.join("&"); //data can now be passed to .send()
encodeURIComponent
是在此使用的正确函数,因为encode
无法正确转义数据
如果你想为所有这些做一个现成的功能,你可以看看http://github.com/oyvindkinsey/easyXDM/blob/master/src/easyXDM.js#L358
答案 1 :(得分:0)
var that = this;
然后在匿名函数中使用that
代替this
。
答案 2 :(得分:0)
如果回调是包含函数中的变量,则它应该在范围内。如果它不是变量,但在包含函数的范围内,则可能需要执行类似
的操作var cb = callback;
var xhrRequest = this;
然后
cb(xhrRequest.responseText);