Javascript Ajax调用发出的回调比预期的多

Javascript Ajax调用发出的回调比预期的多,javascript,ajax,Javascript,Ajax,我有这段代码来发出ajax请求,但是根据Chrome Inspector,与请求相关联的回调被调用了两次(我的意思是响应被记录到控制台中两次),另外两个日志被打印出来,没有任何内容。代码如下: var ajax = { pull: function (settings) { settings.type = 'get'; settings.callback = typeof (settings.callback) === 'function' ? setti

我有这段代码来发出ajax请求,但是根据Chrome Inspector,与请求相关联的回调被调用了两次(我的意思是响应被记录到控制台中两次),另外两个日志被打印出来,没有任何内容。代码如下:

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);
    }
});
var ajax={
拉动:功能(设置){
settings.type='get';
settings.callback=typeof(settings.callback)==“函数”?settings.callback:false;
settings.data=settings.data?settings.data:空;
返回此.request(settings.url、settings.type、settings.callback、settings.data);
},
请求:函数(url、类型、回调、数据){
var id=['MSXML2.XMLHTTP.3.0',
“MSXML2.XMLHTTP”,
“Microsoft.XMLHTTP'],
xhr;
if(window.XMLHttpRequest){
xhr=newXMLHttpRequest();
}否则{
对于(变量i=0;i
xhr.onreadystatechange有几个步骤(编号从0到4,我相信类似于0=未初始化,1=启动等,尽管我再也记不清这些步骤的确切名称了,但快速谷歌应该会找到它们),每个步骤都会调用您的回调。如果我没记错的话,最后一个阶段是4,所以我相信你需要检查这样的东西

if (xhr.readyState == 4 && xhr.status == 200)
{
// call has finished successfully
}
在回调内部,即检查是否全部完成并得到成功响应


这些天我被jQuery宠坏了(用jQuery做起来容易多了),自从我写了原始ajax已经有相当一段时间了。onreadystatechange有几个步骤(从0开始,我相信是0=未初始化,1=开始等,尽管我记不起这些步骤的确切名称,但快速的谷歌应该会找到它们),每一步都在调用回调函数。如果我没记错的话,最后一个阶段是4,所以我相信你需要检查这样的东西

if (xhr.readyState == 4 && xhr.status == 200)
{
// call has finished successfully
}
在回调内部,即检查是否全部完成并得到成功响应


这些天来,我被jQuery宠坏了(用jQuery做起来容易多了),自从我编写了原始ajax以来,已经有相当一段时间了,您使用的是
onreadystatechange
,它会被多次调用(每次状态更改一次)

试用

xhr.onload = function() {
    callback(xhr);
};

您使用的是
onreadystatechange
,它会被多次调用(每次状态更改一次)

试用

xhr.onload = function() {
    callback(xhr);
};

我正试图离开jQuery,事实上,它让我变成了一个懒惰的人。谢谢你的帮助。老实说,我同意,这些天我尽最大努力使用原生javascript,虽然ajax和动画是我还没有恢复的两个领域,但我仍然坐在我的车里,即使它比骑马或步行8英里“更懒”。将车和马与javascript和jQuery进行比较并不十分准确,但我明白你想说的。我认为你不应该使用jQuery,除非你打算大量使用它;这是一个很大的库,不需要用于小事情。我正试图离开jQuery,事实上,它让我成了一个懒惰的人。谢谢你的帮助。老实说,我同意,这些天我尽最大努力使用原生javascript,虽然ajax和动画是我还没有恢复的两个领域,但我仍然坐在我的车里,即使它比骑马或步行8英里“更懒”。将车和马与javascript和jQuery进行比较并不十分准确,但我明白你想说的。我认为你不应该使用jQuery,除非你打算大量使用它;这是一个大图书馆,不需要用于小事情。