0
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');

当函数返回时,它给了我“未定义”。

4

2 回答 2

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调用回调时的内容。如果回调是对象的方法而不是独立函数,这(不是双关语)将很有用。

于 2012-05-02T07:52:00.937 回答
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
} )
于 2012-05-02T07:54:21.073 回答