Почему эта функция не возвращает строку JSON? - PullRequest
0 голосов
/ 12 мая 2011
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 () будет только одной такой функцией, вызываемой в данный момент, и я пытаюсь найти способ передать имя формы как нужную мне функцию.Я искал Stackoverflow и Google.Я не нашел ничего, что работает.

Обратите внимание, я знаю о jQuery, но я еще не там.Мне нужно, чтобы эта функция работала первой.

Ответы [ 6 ]

3 голосов
/ 12 мая 2011

Это потому, что ответом является возвращение addphoto(), что является ничем. То, что вы хотите сделать, это вызвать ajaxCheckForm, когда вызов AJAX завершен:

// 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);
    }
}
3 голосов
/ 12 мая 2011

Это не 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 голос
/ 12 мая 2011

Вы не можете вернуться из обработчика событий (который является onreadystatechange).

Вы должны выполнить работу внутри этого обработчика событий.

0 голосов
/ 12 мая 2011
var response = addphoto(); // <--This is undefined and not sure why

Функция addphoto() никогда не содержит оператора return, поэтому возвращает undefined. И ajaxRequest является асинхронным и не вернется немедленно.

0 голосов
/ 12 мая 2011

Вы отправляете список параметров стиля GET методу POST.

Вам необходимо отправить эту строку в теле вашего HTTP-запроса.

0 голосов
/ 12 мая 2011

addphoto() ничего не возвращает (точнее, возвращает непоследовательно) ... обработчик события onreadystatechange возвращает значение, но нет вызывающей стороны, которая получит эту строку json.

Я бы настоятельно рекомендовал вам абстрагировать эти детали с помощью чего-то вроде jquery ... просто следуйте документации для рекомендуемого использования, и этот код будет намного проще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...