如何使用POST [不使用jquery]从AJAX javascript返回结果?

时间:2012-05-02 07:50:14

标签: javascript ajax

function AJAX(url,data)
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4)
        {
            return xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST",url,true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send(data);
}

var a = AJAX('log.php','username=Leonard&password=asjdklaslkjdalskjdlaksjda');

当函数返回时,它会给我" undefined"。

2 个答案:

答案 0 :(得分:0)

你的函数是异步的 - 它不会在返回之前等待AJAX​​调用完成,所以没有结果可以返回。

试试这个:

function AJAX(url, data, callback, ctx)
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState == 4)
        {
            callback.call(ctx, xmlhttp.responseText);
        }
    }
    xmlhttp.open("POST",url,true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send(data);
}

注意你现在必须提供一个“回调函数”,它将在AJAX完成时调用:

AJAX('log.php','username=Leonard&password=asjdklaslkjdalskjdlaksjda',
    function(result) {
        // do stuff with result
    }
);

编辑我添加的ctx参数是可选的 - 这样您就可以设置调用回调时的this。如果回调是对象的方法而不是独立的函数,那么(没有双关语)将是有用的。

答案 1 :(得分:0)

当您returns xmlhttp.responseText时,您将返回onreadystatechange财产。不是很有用,是吗?

相反,请使用异步行为执行以下操作:

function AJAX( url, data, callback ) {

    // Your stuff

    xmlhttp.onreadystatechange = function() {
        if ( xmlhttp.readyState === 4 ) {
            callback( xmlhttp.responseText )
        }
    }

    // Your other stuff

}

然后,您可以像:

一样使用它
AJAX( url, data, function( responseText ) {
    // use responseText there
} )