为什么这个函数不返回JSON字符串?

时间:2011-05-12 18:39:08

标签: javascript ajax json

function addphoto()
{
    var ajaxRequest = initAjax();
    if (ajaxRequest == false)
    {
        return false;
    }

    // Return Ajax result when the state changes later
    ajaxRequest.onreadystatechange = function()
    {
        if(ajaxRequest.readyState == 4)
        {
            alert(ajaxRequest.responseText);
            return ajaxRequest.responseText;
        }
    }

    // Capture form elements
    var values = {
        "category" : encodeURIComponent(document.addphoto.category.options[document.addphoto.category.selectedIndex].value),
        "photo_title" : encodeURIComponent(document.addphoto.photo_title.value),
        "photo_descrip" : encodeURIComponent(document.addphoto.photo_descrip.value)
    }

    var queryString = '?', i = 0;
    for (var key in values)
    {
        if (i != 0)
        {
            queryString += '&'
        }
        queryString += key + '=' + values[key];
        i++;
    }

    // Execute Ajax
    ajaxRequest.open("POST", "ajaxcheckform.php" + queryString, true);
    ajaxRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    ajaxRequest.setRequestHeader("Content-length", queryString.length);
    ajaxRequest.setRequestHeader("Connection", "close");
    ajaxRequest.send(null);
}

function ajaxCheckform(formname)
{
    var response = addphoto(); // <--This is undefined and not sure why
    var responseObj = JSON.parse(response);

    if (responseObj.success == 1)
    {
        // Successful form!
        alert(responseObj.success_text);
    }
    else
    {
        // Error!
        alert(responseObj.error);
    }
}

我确定我必须在某个地方犯一些基本错误,但我找不到它。在这个脚本中,ajaxCheckform()是一个执行几个类似函数之一的函数。上面,我添加了addphoto(),这是我需要的几个函数之一。

另一方面,我很想知道我可以动态调用一个函数。 addphoto()函数将只是当时调用的一个这样的函数,我正在尝试找到一种方法来传递formname作为我需要的函数。我搜索过Stackoverflow和Google。我发现没有任何效果。

注意,我知道jQuery,但我还没有。我需要先使用此功能。

6 个答案:

答案 0 :(得分:3)

addphoto()不是undefined,而response未定义。ajaxRequest addphoto()是异步的,function addphoto() {... // Return Ajax result when the state changes later ajaxRequest.onreadystatechange = function() { if(ajaxRequest.readyState == 4) { alert(ajaxRequest.responseText); var responseObj = JSON.parse(ajaxRequest.responseText); if (responseObj.success == 1) { // Successful form! alert(responseObj.success_text); } else { // Error! alert(responseObj.error); } } } .... } function ajaxCheckform(formname) { addphoto(); } 函数将在请求完成之前返回。

试试这个

{{1}}

答案 1 :(得分:3)

那是因为响应设置为addphoto()的返回,这没什么。你要做的是在AJAX调用完成后调用ajaxCheckForm

// Return Ajax result when the state changes later
ajaxRequest.onreadystatechange = function()
{
    if(ajaxRequest.readyState == 4)
    {
        ajaxCheckform(ajaxRequest.responseText);
    }
}

然后您的ajaxCheckform将使用该数据:

function ajaxCheckform(responseText)
{
    var responseObj = JSON.parse(responseText);

    if (responseObj.success == 1)
    {
        // Successful form!
        alert(responseObj.success_text);
    }
    else
    {
        // Error!
        alert(responseObj.error);
    }
}

答案 2 :(得分:1)

您无法从事件处理程序(onreadystatechange)返回。

您必须在该事件处理程序中完成工作。

答案 3 :(得分:0)

addphoto()不返回任何内容(或者更确切地说,返回不一致)... onreadystatechange事件的处理程序返回值,但没有调用者将接收该json字符串。

我强烈建议你用jquery之类的东西来抽象这些细节...只需按照文档建议使用,这段代码就会简单得多

答案 4 :(得分:0)

您正在向GET方法发送POST样式参数列表。

您需要在HTTP请求的正文中发送该字符串。

答案 5 :(得分:0)

var response = addphoto(); // <--This is undefined and not sure why

addphoto()函数中从不包含return语句,因此返回undefined。并且ajaxRequest是异步的,不会立即返回。