0

私は ajax リクエストを作成するためのこのコードを持っていますが、Chrome インスペクターによると、リクエストに関連付けられたコールバックが 2 回呼び出されています (これは、応答がコンソールに 2 回ログインされていることを意味します)、さらに 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);
    }
});
4

2 に答える 2

3

xhr.onreadystatechange にはいくつかのステップがあります (0 から 4 までの番号が付けられています。0 = 初期化されていない、1 = 開始などのようなものだと思いますが、ステップの正確な名前はもう思い出せませんが、Google で簡単に見つけることができます)。ステップはコールバックを呼び出しています。私の記憶が正しければ最終段階は4なので、このようなことを確認する必要があると思います

if (xhr.readyState == 4 && xhr.status == 200)
{
// call has finished successfully
}

コールバックの内部、つまり、すべてが終了し、成功した応答があることを確認します

私は最近、jQuery に甘やかされており (jQuery を使用する方がはるかに簡単です)、生の ajax を書いてからかなりの時間が経ちました。

于 2013-09-10T01:06:03.790 に答える
2

を使用していますがonreadystatechange、これは複数回呼び出されます (状態が変化するたびに)。

使ってみて

xhr.onload = function() {
    callback(xhr);
};
于 2013-09-10T01:06:41.500 に答える