2013-04-15 3 views
2

Так что это мой код для некоторых ajax, которые я делаю.Javascript Если оценка оператора не работает правильно

function check_password(){ 

    var username = $("#username").val(); 
    if(username.length > 0){ 
    var bool = -1; 
    $('#Loading2').show(); 
    $.post("check_login.php", { 
     username: $('#username').val(), 
     password: $('#password').val(), 
    }, 
    function(response) { 
     $('#Info2').fadeOut(500); 
     $('#Loading2').hide(); 
     bool = response.indexOf('success'); 
     setTimeout("finishAjax('Info2', '"+escape(response)+"')", 450); 
     $('#password').after(bool); 
     return response.indexOf('success'); 
    }); 

    } 
} 

function finishAjax(id, response){ 

    $('#'+id).html(unescape(response)); 
    $('#'+id).fadeIn(750); 
} 

и здесь я пытаюсь обработать возвращаемое значение из функции проверки пароля.

jQuery(function() { 
    $("#submitl").click(function(){ 
    $(".error").hide(); 
    var hasError = false; 
    var passwordVal = $("#password").val(); 
    var username = $("#username").val(); 

    if (username == '') { 
     $("#username").after('<span style="color:red" class="error"><p></p>Please enter a username.</span>'); 
     hasError = true; 
    } else if (passwordVal == '') { 
     $("#password").after('<span style="color:red" class="error"><p></p>Please enter a password.</span>'); 
     hasError = true; 
    } else if (check_password() != 73) { 
     hasError = true; 
     $("#password").after(check_password()); 
    } 
    if (hasError == true) { 
     return false; 
    } 
    }); 
}); 

По какой-то причине, если оператор возвращает истину, даже если индекс (возвращаемое значение) есть 73. Я проверить это с помощью JQuery в заявлении, если распечатать значение функции, возвращающей и распечатывает 73. У меня такое чувство, что моя ошибка вызвана динамически типизированными переменными в javascript.

+0

Это асинхронный не синхронный. Ваша функция не будет ждать результата, поэтому всегда будет TRUE. –

+1

Возможный дубликат: десятки вопросов в месяц ;-) – jahroy

+0

Передача строки в 'setTimeout'? ... пожалуйста, не делайте этого –

ответ

1

Типичная ошибка asynchronous вызовов AJAX. Вы возвращаете response.indexOf('success'); из вашего обратного вызова AJAX, но поскольку он является асинхронным обратным вызовом, возврату нечего. Остальная часть вас check_password функция давно закончила, когда вызывается обратный вызов.

Чтобы исправить это, вам необходимо полностью перестроить код. В обработчике кликов сначала нужно вызвать функцию post(), а затем в обратном вызове вам нужно пройти через блоки if/else if.

0

Ваша функция'checkpassword() 'фактически не возвращает значение. Он запускает запрос в PHP-файл и сразу же возвращает (без значения).

Вы указываете обратный вызов, когда вызов возвращается, но который никогда не возвращается к исходной функции.

Вы могли бы сделать что-то вроде этого:

function check_password(callback){ 

    var username = $("#username").val(); 
    if(username.length > 0){ 
    var bool = -1; 
    $('#Loading2').show(); 
    $.post("check_login.php", { 
     username: $('#username').val(), 
     password: $('#password').val(), 
    }, function(response){ 
     $('#Info2').fadeOut(500); 
     $('#Loading2').hide(); 
     bool = response.indexOf('success'); 
     setTimeout("finishAjax('Info2', '"+escape(response)+"')", 450); 
     $('#password').after(bool); 
     callback(response.indexOf('success')); 
    }); 

    } 
} 
function finishAjax(id, response){ 

    $('#'+id).html(unescape(response)); 
    $('#'+id).fadeIn(750); 
} 


jQuery(function(){ 
     $("#submitl").click(function(){ 
     $(".error").hide(); 
     var hasError = false; 
     var passwordVal = $("#password").val(); 
     var username = $("#username").val(); 
    if (username == '') { 
      $("#username").after('<span style="color:red" class="error"><p></p>Please enter a username.</span>'); 
      hasError = true; 
     } 
    else if (passwordVal == '') { 
      $("#password").after('<span style="color:red" class="error"><p></p>Please enter a password.</span>'); 
      hasError = true; 
     } 
    else (
     check_password(function(returnValue) { 
      if (returnValue != 73) { 
       hasError = true; 
       $("#password").after(check_password());    
      } 
     })){ 

     } 
     if(hasError == true) {return false;} 
    }); 
}); 

Конечно, этот код просто показывает вам, как получить значение внутри другой функции, но вам все еще нужно, чтобы справиться с тем, что вы другие функции не возвращается немедленно и что, например, значение HasError не устанавливается сразу.

0

Ваша проблема в том, что вы возвращаетесь из внутренней функции, которая никогда не будет работать в JavaScript. Передача обратного вызова:

function check_password(callback) { 
    // ... 
    callback(response.indexOf('success')); 
} 
// ... 
check_password(function(result) { 
    if(result != 73) { 
     // ... 
    } 
}) 

Просто выполните поиск JavaScript AJAX, и вы найдете много сайтов для изучения. Вот один из них: http://www.html5rocks.com/en/tutorials/async/deferred/

Смежные вопросы