我有这段代码来发出ajax请求,但是根据Chrome Inspector,与该请求相关联的回调被调用了两次(这意味着响应被两次登录到控制台中),另外还有2条没有任何内容的日志被打印。这是代码:
var ajax = {
pull: function (settings) {
settings.type = 'get';
settings.callback = typeof (settings.callback) === 'function' ? settings.callback : false;
settings.data = settings.data ? settings.data : null;
return this.request(settings.url, settings.type, settings.callback, settings.data);
},
request: function (url, type, callback, data) {
var ids = ['MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP'],
xhr;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
for (var i = 0; i < ids.length; i++) {
try {
xhr = new ActiveXObject(ids[i]);
break;
} catch (e) {}
}
}
if (callback) {
xhr.onreadystatechange = function () {
callback(xhr);
};
}
xhr.open(type, url, true);
if (type.toUpperCase() === 'GET') {
xhr.send();
} else if (type.toUpperCase() === 'POST') {
xhr.send(data);
}
}
}
ajax.pull({
url: 'http://localhost/my/twtools/scripts/ajax.php',
callback: function (xhr) {
console.log(xhr.response);
}
});
最佳答案
xhr.onreadystatechange有几个步骤(从0到4编号,我确实相信类似0 =未初始化,1 =开始等,尽管我再也无法记录这些步骤的确切名称了,快速的Google应该找到它们),每个步骤是调用您的回调。如果我没记错的话,最后一个阶段是4,所以我相信您需要检查以下内容
if (xhr.readyState == 4 && xhr.status == 200)
{
// call has finished successfully
}
在您的回调中进行检查,即检查是否已完成并获得成功的响应
这些天来,我被jQuery宠坏了(使用jQuery变得容易得多),距我编写原始Ajax已有相当一段时间了