【问题标题】:jquery ajax dont work without firebug break point没有 firebug 断点 jquery ajax 不起作用
【发布时间】:2012-04-29 01:23:51
【问题描述】:

我正在使用以下方法调用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。我不明白为什么会这样。请帮忙!谢谢。

【问题讨论】:

    标签: php jquery mysql ajax firebug


    【解决方案1】:

    为什么会这样

    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 响应之前点击了if(val == ".")。您需要在 ajax 回调函数中使用整个 if 语句。

      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
      • @idrumgood 在 AJAX 响应实际设置变量之前,您仍在返回变量。
      • @idrumgood 我按照你说的编辑我的代码。但还是不行。不过,如果我设置一个断点,它会起作用。
      • 由于.load 函数不能直接返回值,您可能需要稍微重构其他代码以适应这一点。但是,我的代码将解决您在帖子中提出的问题。
      【解决方案3】:

      如果您想让该代码正常工作,您应该使用 $.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; 
        }
       });
      

      【讨论】:

        【解决方案4】:

        您遇到此问题的原因是您执行了异步请求。这意味着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;
          }
        
        }
        

        【讨论】:

        • 很棒的文章。谢谢你的解释。现在我明白了。再次感谢。
        • OMG - 这么简单的解决方案花了这么多时间:添加 'async: false' 解决了我的问题。谢谢。
        猜你喜欢
        • 1970-01-01
        • 2013-07-14
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        相关资源
        最近更新 更多