jQuery Ajax在没有Firebug断点的情况下无法工作。

4

我正在使用以下方法调用php:

function validateEmaiAjax(email){
    val = null;
    $("#warning").load("https://localhost/Continental%20Tourism/register_ajax.php",{email: email}, function(rspns, stat, xml){
        val = rspns;
    });

    if(val == ".")
        return true;
    else {
        return false;
    }
}

我的 PHP 代码是:

<?php
    $dbc = mysqli_connect("localhost","root","pass","continental_tourism") OR die(mysqli_connect_error());

    $email = $_REQUEST['email'];

    $query = "SELECT email FROM customer_info WHERE email = '$email' ";

    $r = mysqli_query($dbc, $query) OR die(mysqli_error($dbc));

    if(mysqli_num_rows($r) > 0)
        echo "Email address exists!";
    else
        echo ".";   
?>

基本上,这会检查数据库,如果电子邮件已存在,则显示“电子邮件地址已存在!”如果不存在,我想要return true(因此我会输出“。”并进行比较)。奇怪的是,如果我在if(val ==“。”)附近使用firebug中断点,程序就可以正常工作并返回true。如果我删除那个断点,函数始终返回false。我不明白为什么会发生这种情况。请帮忙!谢谢。

4个回答

7
你遇到这个问题的原因是因为你执行了一个异步请求。这意味着在从服务器接收到响应之前,if(rspns == ".")将被执行,并且结果将始终为false
为了将此代码包装在返回布尔值且不需要回调函数(阻塞过程)的函数中,您需要使用同步请求:
function validateEmaiAjax(email) {

  // This is the correct way to initialise a variable with no value in a function
  var val;

  // Make a synchronous HTTP request
  $.ajax({
    url: "https://localhost/Continental%20Tourism/register_ajax.php",
    async: false,
    data: {
      email: email
    },
    success: function(response) {
      // Update the DOM and send response data back to parent function
      $("#warning").html(response);
      val = response;
    }
  });

  // Now this will work
  if(val == ".") {
    return true;
  } else {
    $("#warning").show();
    return false;
  }

}

很棒的文章。感谢您的解释。现在我明白了。再次感谢。 - Jayanga Kaushalya
哎呀,浪费了这么多时间在一个如此简单的解决方案上:添加“async: false”解决了我的问题。谢谢。 - JonV

2
为什么要这样做?
else {
    return false;
    $("#warning").show();
}

$("#warning").show(); 永远不会被执行。

编辑:就是这样:

function validateEmaiAjax(email){
    var URL     = 'https://localhost/Continental%20Tourism/register_ajax.php';
    var Args    = {email: email}

    $('#warning').load(URL, Args, function(html){
        if(html == '.'){
            return true;
        } else {
            $('#warning').show();
            return false;
        }
    });

    return false;
}

或者您也可以尝试这个方法:
function validateEmaiAjax(email){
    var URL     = 'https://localhost/Continental%20Tourism/register_ajax.php';
    var Args    = {email: email}

    $.ajax({
        url:     URL,
        type:    'GET'
        data:    Args,
        success: function(html){
            if(html == '.'){
                return true;
            } else {
                $('#warning').show();
                return false;
            }
        }
    });

    return false;
}

2
如果你想让那段代码工作,你应该使用 $.ajax 方法而不是 load,并将 async 设置为 false 以使其等待响应。

http://api.jquery.com/jQuery.ajax/

$.ajax({
 url:"https://localhost/Continental%20Tourism/register_ajax.php",
 async: false,
 data: {email: email}, 
 success: function(rspns, stat, xml){ 
   val = rspns; 
  }
 });

0
这是因为你的函数一直在运行并且在获取ajax响应之前就触发了if(val == ".")。你需要将整个if语句放在ajax回调函数内部。
function validateEmaiAjax(email){
    var success;
    $("#warning").load("https://localhost/Continental%20Tourism/register_ajax.php",{email: email}, function(rspns, stat, xml){
        if(rspns == ".")
            success = true;
        else {
            $("#warning").show();
            success = false;
        }
    });
    return success;
}

还交换了警告显示和返回,以便执行


这仍然无法解决问题。validateEmaiAjax()现在将返回undefined - DaveRandom
1
@idrumgood 在 AJAX 响应实际设置变量之前,您仍然返回该变量。 - Evan Davis
@idrumgood 我按照你说的修改了代码。但仍然无法工作。如果我放一个断点,它就能工作。 - Jayanga Kaushalya
由于.load函数不能直接返回值,你可能需要略微重构其他代码以适应它。然而,我的代码将会修复你在帖子中提到的问题。 - idrumgood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接