Ajax成功事件不起作用

224

我有一个注册表单,正在使用 $.ajax 提交它。

这是我的 AJAX 请求:

$(document).ready(function() {
    $("form#regist").submit(function() {
        var str = $("#regist").serialize();
        $.ajax({
            type: 'POST',
            url: 'submit1.php',
            data: $("#regist").serialize(),
            dataType: 'json',
            success: function() {
                $("#loading").append("<h2>you are here</h2>");
            }        
        });
        return false;        
    });
});

在我的submit1.php文件中,我检查数据库中是否存在字段电子邮件地址用户名。如果这些值存在且不需要刷新页面,我希望显示错误消息。

我该如何将此添加到AJAX请求的success回调函数中?


4
你确定成功回调函数被执行了吗? - rahul
1
你需要针对你的第二个问题提出一个新的问题。 - Mike Lyons
17个回答

431

结果可能不是JSON格式,因此当jQuery试图解析它时会失败。您可以通过error:回调函数捕获该错误。

在那个函数中似乎不需要JSON,因此您还可以将dataType: 'json'行移除。


24
我把数据类型改成了文本,现在它可以工作了。就像这样:dataType:'text' - Magesh
4
如果没有指定 dataType:,但 url:.json 结尾,也会发生这种情况。 - davetapley
1
$.post 中,如果别名提供了 json 作为数据类型,但实际上没有来自服务器的 JSON 数据,这不会触发 success 回调函数。 - baldrs
如果你想进行JSON AJAX请求,请确保它的MIME类型设置为application/json。这曾经给我带来了一些麻烦。 - Gellweiler
我必须补充说明,我也遇到了同样的问题,只需完全删除数据类型属性即可解决。我只是使用纯文本而不是JSON。 - Richard Barker
显示剩余5条评论

23
虽然问题已经解决,但我希望这能帮助其他人。我犯了一个错误,尝试直接使用函数(成功:OnSuccess(productID)���。但是你必须先传递一个匿名函数:
  function callWebService(cartObject) {

    $.ajax({
      type: "POST",
      url: "http://localhost/AspNetWebService.asmx/YourMethodName",
      data: cartObject,
      contentType: "application/x-www-form-urlencoded",
      dataType: "html",
      success: function () {
        OnSuccess(cartObject.productID)
      },
      error: function () {
        OnError(cartObject.productID)
      },
      complete: function () {
        // Handle the complete event
        alert("ajax completed " + cartObject.productID);
      }
    });  // end Ajax        
    return false;
  }

如果您不使用匿名函数作为包装器,即使Web服务返回异常,OnSuccess也会被调用。


6
这与Ajax、jQuery或处理程序无关。我们可以添加一条注释来提醒“整个代码应该包裹在<script>标签中”。这个解释是错误的:你不需要把任何东西包装在匿名函数中,一个命名函数也可以,只要你传递它而不是调用它。更重要的是,这个解释是误导性的:OnSuccess 在请求发送之前就会被调用,因此将其与 Web 服务返回任何内容相关联是没有意义的。 - fdreger
这个答案对我很有帮助,但是我没有点赞,你应该根据 @fdreger 的评论更新你的答案。 - Ozair Kafray
1
对我来说,completeerror可以正常工作,但是success无法正常工作。 - AnonymousUser

17

我尝试删除dataType这一行,但对我没有用。我通过使用“complete”而不是“success”作为回调来解决了这个问题。在IE中,成功的回调仍然失败,但由于我的脚本仍然运行并完成了,所以这就是我关心的全部。

$.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: someData,
    complete: function(jqXHR) {
       if(jqXHR.readyState === 4) {
          ... run some code ... 
       }   
    }        
 });

在jQuery 1.5中,您也可以像这样做。

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});

11
请注意,complete函数总是会被调用,无论Ajax调用是否成功,而success函数只有在Web服务器响应一个“200 OK”HTTP标头(一切正常)时才会被调用。 - katalin_2003

10

确保在生成PHP文件中的JSON格式数据之前,不要打印(echo或print)任何文本/数据。这可能会解释为什么您会得到一个“成功200 OK”,但是您的javascript中的成功事件仍然失败。您可以通过在firebug中检查“网络-答案”部分来验证脚本接收到的内容是否正确POST submit1.php。


这真的帮了我很多。我知道这是一个旧答案,但它正好解决了我一直遇到的问题。在调试期间使用echo或print_r并发现它们实际上导致了错误... :) 谢谢! - lennyklb
六年后,我仍然通过这个答案帮助着人们!否则我不知道该去哪里寻找。 - Tania Rascia

7
在你的success回调函数中加入一个alert(),以确保它被正确地调用。如果没有被调用,那很可能是因为请求并没有成功,即使你已经成功地访问了服务器。造成这种情况的原因可能是超时,或者你的php代码抛出了异常。
如果你还没有安装火狐浏览器的firebug插件,请先安装它,并检查AJAX回调函数。你将能够看到响应结果,以及是否收到了成功的(200 OK)响应。你也可以在complete回调函数中再加入另一个alert(),这个回调函数应该肯定会被调用。

感谢您的回复。已尝试在成功事件中使用警报,但未生效。我在Firefox上安装了Firebug插件,并且它确实收到了成功(200 OK)的响应,所以没有问题...我的PHP文件中调用了一个die函数来处理任何错误,当我在Firebug中检查时,它显示了适当的响应。您说的“您还可以在完成回调中放置另一个警报(alert()),这肯定会被调用。”是什么意思?非常感谢快速回复。 - codingbbq
2
如果您在“成功”中没有看到警报,则不是成功。由于响应是200 OK,Tatu的回复似乎合理,但为了进一步排除故障,您可以使用另一个事件,称为“complete”,该事件始终被调用,无论请求是否成功(仅当请求成功时才会发生“success”)。 complete:function(xhr,status){alert('complete:'+ status);} - David Hedlund

4

我返回了有效的JSON,在我的“完成”回调中得到了200的响应,并且可以在Chrome网络控制台中看到它... 但是我没有指定

dataType: "json"

曾经我遇到一个问题,与“被接受的答案”不同的是,我的方法实际上解决了这个问题。


3

我曾经遇到过同样的问题。这是因为javascript希望返回数据的类型是json,但如果你在php中使用了echoprint函数,则会发生这种情况。如果你在php中使用echo函数来返回数据,只需删除dataType: "json"就能正常工作。


2
你需要声明成功和错误回调函数。添加
error: function(err) {...} 

最初的回答应该修复这个问题。

1
我正在使用XML将PHP服务器返回的结果传递回网页,我遇到了同样的问题。
在我的情况下,原因是结束标记与开始标记不匹配。
<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <result>
        <status>$status</status>
        <OPENING_TAG>$message</CLOSING_TAG>
    </result>";
?>

1
我使用ajax函数从Magento中恢复用户密码时遇到了问题。成功事件没有被触发,后来我意识到有两个错误:
  1. 结果没有以JSON格式返回
  2. 我尝试将数组转换为JSON格式,但该数组包含非utf字符
因此,每次我尝试使用json_eoncde()对返回的数组进行编码时,该函数都无法正常工作,因为其中一个索引具有非utf字符,其中大多数是巴西葡萄牙语单词的重音。

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