【问题标题】:ajax call with html form won't work properly使用 html 表单的 ajax 调用将无法正常工作
【发布时间】:2010-08-01 22:02:27
【问题描述】:

我被困住了。

就像脚本根本没有任何功能一样。

        <script>
            $("#continue").click(function () {
        $.ajax({
           type: "POST",
           url: "dbc.php?check=First",
           data: {full_name : $('#full_name').val()
                 usr_email : $('#usr_email').val()},
           success: function(msg){
               if(msg==1){
                  $("#First_1").hide();
                  $("#Next_2").toggle(); 
               }else{
                  alert(msg)
               }               
            }
         });
         return false;
    }); 
        </script>

        <form action="index.php?page=checkin" method="post" name="regForm">
     <div id="First_1">
    <table width="100%" cellpadding="0" cellspacing="0">
                        <tr>
                            <td>
                                <table cellpadding="0" cellspacing="5">
                                    <tr>
                        <td style="padding: 5px;">
                        Fullständiga namn: 
                        </td>
                        <td>
                        <input name="full_name" type="text" id="full_name" class="required"> 
                        </td>
                                    </tr>
                                    <tr>
                        <td style="padding: 5px;">
                        Email:
                        </td>
                        <td>
                        <input name="usr_email" type="text" id="usr_email" class="required email">
                        </td>
                                    </tr>
                                    <tr>
                        <td style="padding: 5px;">
                        Sex: 
                        </td>
                        <td>
                        <select name="sex">
                        <option value="male">Kille</option>
                        <option value="female">Tjej</option>
                        </select>
                        </td>
                                    </tr>
                        <td>
                        <input type="submit" id="continue" value="Continue">
                        </td>
                </table>
        </td>
            </tr>
    </table>
</div>

当我按下继续时,它应该发送 ajax 调用,但它没有。当我按继续时,它只会将我带到表单的 action="index.php?page=checkin",即使那里返回 false;点击(在脚本中)?我什至尝试更改表单行并插入 onsubmit="return false;"但是当我点击按钮时什么都没有发生。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    问题在于它正在执行默认操作,因为您的任何 jQuery 代码都没有运行 :) 当您的代码运行时,id="continue" 元素还不存在,所以 $("#continue") 找不到任何东西来绑定click 处理程序。这是一个简单的解决方法,将您的代码包装在 document.ready 调用中,如下所示:

    $(function() {
      $("#continue").click(function () {
        $.ajax({
           type: "POST",
           url: "dbc.php?check=First",
           data: {full_name : $('#full_name').val()
                 usr_email : $('#usr_email').val()},
           success: function(msg){
               if(msg==1){
                  $("#First_1").hide();
                  $("#Next_2").toggle(); 
               }else{
                  alert(msg)
               }               
            }
         });
         return false;
      });
    }); 
    

    通过这样做,它会等到 DOM 准备好,并且您的元素在那里可以找到/绑定。另外,不要附加到#continue 按钮的click 事件,通常最好附加到表单的submit 处理程序,所以它会被捕获,所以不要这样:

    $("#continue").click(function () {
    

    你会这样做:

    $("form[name='regForm']").submit(function() {
    

    其他一切都保持不变。

    【讨论】:

    • 我现在有这样的代码,但我仍然没有结果,仍然需要我采取行动,有什么特别的地方应该有代码吗?并且建议将其附加到表单的提交处理程序中,这是一个否,因为正如您在代码中看到的那样,表单提交在 div #Next_2 中,它被切换了。该调用用于检查 full_name 和 usr_email 是否有效。
    • @Karem - 您也可以在submit 上查看所有这些内容...这就是 jQuery 验证插件的工作方式,例如 :) 您是否遇到任何 JavaScript 错误?它仍然表现得好像你的代码没有正确运行,出错并且没有附加,检查你的控制台是否有错误,看看那里是否有任何东西。
    • 我得到这个:属性列表后缺少 },成功:function(msg) {
    【解决方案2】:

    对我来说听起来像是一个错字,它看起来像在您的数据字段中。

    我建议这样做

    data: "value1="+$("#val1").val()+"&value2="+$("#val2").val() 
    

    另外一个调试 javascript 的好方法是打开 chrome 的控制台或在 firefox 中使用 firebugs 控制台,当您执行操作时,它通常会通知您有问题或缺少问题。

    最后一点:我建议在您从 php 的返回中使用 json,这样您可以为用户提供更符合要求的信息。例如,假设您的表单没有验证服务器端(您正在验证服务器端对吗?)您可以向客户端返回一条很好的消息,向他们解释没有验证。这个怎么做?

      $.ajax({
               type: "POST",
               url: "dbc.php",
               data: "val1="+$(#val1).val()+"&val2="+$(#val2).val(), 
               success: function(json){
                   if(json.error){
                      //notify user of error message
                      $(#statusDiv).(json.message); 
                   }else{
                      //perform success 
    
                   }               
                }
             });
    

    并在服务器端使用诸如

    之类的东西
    echo json_encode(array("error"=>1, "message"=>"<insert validation problems here>")); 
    

    这将通过 json.error 或 json.message 访问成功函数。

    【讨论】:

    • 好的,我现在改成这个:data: "full_name="+$("#full_name").val()+"&usr_email="+$("#usr_email").val()当我在 fierfox 控制台中看到它在属性列表后显示缺少 } 时,成功:function(msg){ .. 这是什么意思,我看不到哪里缺少 }
    【解决方案3】:

    在 phpbin 上的新代码中,行后需要一个逗号:

     data: "full_name="+$("#full_name").val()+"&usr_email="+$("#usr_email").val(), // <-- COMMA HERE
    

    或者,在您的旧代码中(这更好,因为您不必自己处理连接数据 url),您在两行之间也缺少一个逗号:

    data: {full_name : $('#full_name').val(), // <-- COMMA HERE
             usr_email : $('#usr_email').val()},
    

    另外,这行后面需要一个分号:

    alert(msg); // <-- SEMICOLON HERE
    

    ;)

    【讨论】:

    • 它现在开始工作,我相信,虽然当我现在按继续时,我得到一个没有任何内容的警报?我的意思是里面没有错误信息。为什么?这里是 dbc.php?check=First phpbin.net/x/249121011
    • PHP 端可能有错误?如果出现错误,为什么不回显其他内容 - 在最后一个 if 之后添加 else 语句: if (empty($err)) {echo 1;} else {echo "there was an error";}
    猜你喜欢
    • 2011-09-20
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2013-01-17
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多