1

成功した AJAX 呼び出しから応答を返す純粋な JavaScript 関数 (申し訳ありませんが、jQuery はありません) が必要です。これまでに得た関数はHTMLobject次のとおりです。応答から HTMLを返したいと思います。

function getHtml(url) {
    var httpRequest;
    var HTMLobject;

    if (window.XMLHttpRequest) {
        httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

    if (!httpRequest) {
        console.error('Cannot create an XMLHTTP instance');
        return false;
    }

    httpRequest.onreadystatechange = function() {
        if (httpRequest.readyState === 4) {
            if (httpRequest.status === 200) {
                // OK, turn the string into HTML.
                var div = document.createElement('div');
                div.innerHTML = httpRequest.responseText;
                // Assign the converted HTML to HTMLobject.
                HTMLobject = div.childNodes[0];
            } else {
                console.debug('There was a problem with the request.');
            }
        }
    };

    httpRequest.open('GET', url);
    httpRequest.send();

    return HTMLobject;
}

が undefinedを返す理由はわかってHTMLobjectいますが、動作させるにはそれが必要です。AJAX が完了した後に関数がオブジェクトを返すようにする方法はありますか?

4

2 に答える 2

1

以下のようにするだけで、リクエストを同期させる

httpRequest.open('GET', url,false);//false make request synchronous 
 httpRequest.send();

「false」オプションは、呼び出しが同期的であることを示します。つまり、応答が返されるまでコードがハングします。

于 2013-02-28T11:03:09.043 に答える
1

いいえ、そのような場合の解決策は、コールバック関数を使用することです。

元:

function getHtml(url, callback) {
    ....
    ....
    callback(HTMLobject); //instead of returning the HTMLobject, call a callback function as pass the `HTMLobject` as a argument.
}

使用法:

getHtml('url', function(HTMLobject){
    //Do something with HTMLobject
});

それ以外の

var HTMLobject = getHtml('url');
//Do something with HTMLobject

リクエストが完了するまでページがブロックされるため、リクエストasync: falseを行うことはお勧めできません (UI は再描画されず、UI の操作は行われません)

于 2013-02-28T11:00:13.047 に答える