2

所以这是我正在做的一些 ajax 的代码。

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,if 语句也会返回 true。我通过在 if 语句中使用 jquery 打印出返回函数的值并打印出 73 来测试这一点。我有一种感觉错误是由于 javascript 中的动态类型变量引起的。

4

3 回答 3

1

AJAX 调用的典型asynchronous行为问题。您response.indexOf('success');从 AJAX 回调中返回,但由于它是异步回调,因此没有可返回的内容。当回调被调用时,其余的check_password函数早就完成了。

要解决此问题,您需要完全重构代码。在您的点击处理程序中,您首先需要调用您的post()函数,然后在回调中您需要遍历您的if/else if块。

于 2013-04-15T22:22:31.037 回答
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 的值没有立即设置。

于 2013-04-15T22:25:33.360 回答
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/

于 2013-04-15T22:29:07.330 回答