jQuery ajax 在带有链接的表单提交上失败


jQuery ajax fails on form submit with link

在这个问题的顺序中,我在表单中获得的内容现在正在更新数据库。但是,当我单击此链接时

<a onclick="doUpdate()" href="#" id="commit-changes" class="uibutton submit_form">Gravar</a>

jQuery .ajax 函数触发错误回调,并用信息更新数据库。

这是代码

function doUpdate()
{
              e.preventDefault();
              $.ajax({
                type: "POST",
                data: $("#validation").serialize(),
                cache: false,
                url:"modules/user/updateuser.php",
                success : function(data){
                    $("#response-update").html(data);
                },
                error:  function(data){
                    $("#response-update").html("Erro na submissão");
                }                
           });
          }

我想获得成功回调,以便在保存数据时向用户显示一条很好的消息。

但是,如果我只是这样做

 <a href="#" id="commit-changes" class="uibutton submit_form">Gravar</a>
 <script>
 $(function(){
 $('#commit-changes').click(function(e){
              e.preventDefault();
              $.ajax({
                type: "POST",
                data: $("#validation").serialize(),
                cache: false,
                url:"modules/user/updateuser.php",
                success : function(data){
                    $("#response-update").html(data);
                },
                error:  function(data){
                    $("#response-update").html("Erro na submissão");
                }                
           });
          });
 });
 </script>

"提交"根本不起作用。

如何解决这个问题?被这部分困了好几天!:(

编辑 - 表单的 HTML(这也是在页面乞求中加载的响应)

  $response.='<form id="validation" method="post"> 
                                <fieldset >
                                <input type="hidden" name="user_id" value="'.$_POST['user_id'].'"/>
                                <legend>Actualizar Dados Utilizador</legend>
                                      <div class="section ">
                                      <label>Nome<small>Insira o seu nome</small></label>   
                                      <div> 
                                      <input type="text" class="validate[required,custom[onlyLetterSp]] large" name="nome" id="f_required" value="'.utf8_encode($rcs_user->nome).'">
                                      </div>                                      
                                      </div>';
 $response.='<div class="section ">
                                      <label> Email<small>Insira o seu email</small></label>   
                                      <div> 
                                      <input type="text" class="validate[required,custom[email]] large" name="email" id="e_required" value="'.  utf8_encode($rcs_user->email).'">
                                      </div>
                                      </div>';
 $response.= '<div class="section">
                                        <label>Permissões<small>Seleccione o tipo de utilizador </small></label>   
                                        <div>
                                            <select class="medium" name="role">
                                                       '.$role.'                                                 
                                            </select>       
                                      </div>
                                      </div>                                      
                                     <div class="section">
                                            <label>Activo<small>Activar utilizador</small></label>

                                         <div>
                                            '.$activo.'
                                            <span class="f_help">ON / OFF  </span> 
                                        </div>
                                  </div>
                                  <div class="section last">
                                  <div>
                                     <a onclick="return doUpdate()" href="#" id="commit-changes" class="uibutton submit_form">Gravar</a><a class="uibutton special"   onClick="ResetForm()" title="Limpar Formulário"   >Limpar Formulário</a>
                                 </div>
                                 </div>
                                </fieldset></form>

你是否将 jQuery 代码放在 document.ready 处理程序中?

jQuery(function ($) {
    // put jQuery here
});

第一个示例无需document.ready即可工作(但没有多大意义,因为无论如何您都在使用 jQuery)。第二个不会。

为了按预期运行 doUpdate() 函数,请尝试此操作

将锚标记 onclick 属性修改为

<a onclick="return doUpdate()" href="#" id="commit-changes" class="uibutton submit_form">Gravar</a>

并将 doUpdate 函数更改为

function doUpdate()
{
  $.ajax({
     type: "POST",
     data: $("#validation").serialize(),
     cache: false,
     url:"modules/user/updateuser.php",
     success : function(data){
         $("#response-update").html(data);
     },
     error:  function(data){
         $("#response-update").html("Erro na submissão");
     }                
  });
  return false;
}

jquery ajax 成功/错误回调将根据是否收到 POST 请求而触发,它与您发布到的文件中实际发生的情况无关。奇怪的是,您会收到错误回调并更新数据库,但是您可以尝试让您发布的php文件给出响应,然后根据该响应运行成功/错误。

在你的 php 文件中,你可以有这样的东西:

$testQuery = "QUERY STRING HERE";
if(!mysql_query($testQuery))
{
    echo "error";
    exit;
}
else
{
    echo "sucess";
    exit;
}

然后在你的doUpdate函数中,你可以根据html运行成功回调和输出

    function doUpdate()
{
              e.preventDefault();
              $.ajax({
                type: "POST",
                data: $("#validation").serialize(),
                cache: false,
                url:"modules/user/updateuser.php",
                success : function(data){
                   if(data == "success")
                   {
                       $("#response-update").html(data);
                   }
                   else
                   {
                       $("#response-update").html("Erro na submissão");
                   }                    
                }            
           });
          }

您还可以使用"完整"回调,即使未收到 POST 也会触发,除了函数已运行之外,它不会告诉您任何其他内容

我有一个解决方案。不是最漂亮的,因为我想要一个纯粹的jQuery解决方案,但是,它运行良好。

只需要更改

<a onclick="doUpdate()" href="#" id="commit-changes" class="uibutton submit_form">Gravar</a>

<input onclick="doUpdate()" href="#" id="commit-changes" class="uibutton submit_form" value="Gravar" />

现在它适用于成功回调触发。

感谢您对此的所有帮助。