题 Ajax成功事件无效


我有一份注册表,正在使用 $.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请求?


157
2017-12-28 13:31


起源


你确定调用了成功回调吗? - rahul
您需要针对第二个问题提出新问题。 - Mike Lyons


答案:


结果可能不是JSON格式,所以当jQuery尝试解析它时,它会失败。你可以抓住错误 error: 回调函数。

你似乎不需要那个函数中的JSON,所以你也可以拿出来 dataType: 'json' 行。


326
2017-12-28 13:41



+1似乎是错误的可能原因 - David Hedlund
@idrish,将正确答案标记为已接受是礼貌的,以便其他人不会不小心回答。 - Tatu Ulmanen
也为我工作! - Marci-man
我将dataType更改为文本并使其正常工作。喜欢这个 dataType:'text' - Magesh
如果a,也会发生这种情况 dataType: 没有指定,但是 url: 结束 .json。 - dukedave


虽然问题已经解决,但我希望它能帮到别人。

我犯了一个错误,试图直接使用这样的函数(成功: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。


14
2017-09-19 13:12



谢谢@js newbee。 - noobcode
这与ajax,jquery和处理程序无关。我们也可以发表评论提醒“整个代码应该包含在脚本标签中”。解释是错误的:你不必在匿名函数中包装任何东西,只要你传递它而不是调用它,命名函数就会这样做。此外,它具有误导性:OnSuccess在请求被发送之前被调用,因此将它与webservice关联返回任何内容都没有意义。 - fdreger
这个答案对我有帮助,但我没有投票,你应该根据@fdreger评论更新你的答案。 - Ozair Kafray


我尝试删除dataType行,但它对我不起作用。我通过使用“完整”而不是“成功”作为回调解决了这个问题。 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 ... 
    }
});

14
2018-03-19 13:35



请注意这一点。 complete 无论ajax调用是否成功,都将始终被调用 success 只有在Web服务器响应时才会被调用 200 OK HTTP标头(一切都OK)。 - katalin_2003


在PHP文件中生成JSON格式化数据之前,请确保不打印(回显或打印)任何文本/数据。这可以解释你得到了一个200美元 - 但是你的成功事件仍然在你的javascript中失败了。您可以通过在firebug中查看POST submit1.php的“网络 - 应答”部分来验证脚本接收的内容。


10
2018-02-17 23:28



谢谢你,谢谢你,谢谢你。 - Ryan Wheale
这真的帮助了我。我知道这是一个陈旧的答案,但它确实是我遇到的问题。在调试过程中使用echo或print_r,并发现那些实际上导致错误... :)谢谢! - Lennart Kloppenburg
6年后,仍然帮助人们解决这个问题!我不知道在哪里看别的。 - Tania Rascia


放一个 alert() 在你的 success 回调以确保它被调用。

如果不是,那只是因为请求根本没有成功,即使你设法击中服务器。合理的原因可能是超时到期,或者PHP代码中的某些内容引发异常。

如果你还没有安装firefox的firebug插件,请检查AJAX回调。您将能够看到响应,以及它是否收到成功(200 OK)响应。你也可以放另一个 alert() 在里面 complete  回调,绝对应该被调用。


4
2017-12-28 13:40



感谢您的回复。在成功事件中尝试了警报,但它没有奏效。我有火狐的firebug插件,它确实收到一个成功的(200 OK)响应,所以没有问题..我有一个模具函数在我的PHP文件中调用任何错误,当我在firebug中检查它,它显示正确的响应。你的意思是“你还可以在完整的回调中添加另一个警告(),这应该被调用。”非常感谢您的快速回复 - noobcode
如果你没有看到你的警报 success那就不成功了。由于响应是200 OK,Tatu的回复似乎是合理的,但是为了进一步排除故障,你可以使用另一个叫做的事件 complete 总是被调用,无论请求是否成功(success 只有在请求成功时才会发生)。 complete: function (xhr, status) { alert('complete: '+status); } - David Hedlund


我有同样的问题。它发生是因为 javascript 期望 json 返回数据的数据类型。但如果您在php中使用echo或print,则会出现这种情况。如果你使用 echo 功能 php 要返回数据,只需删除即可 dataType : "json" 工作得很好。


3
2018-04-10 06:46





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

dataType: "json"

一旦我做了,不像“接受的答案”,实际上解决了问题。


1
2017-10-31 15:30





我有一个问题,使用ajax函数从Magento恢复用户密码。成功事件没有被解雇,然后我意识到有两个错误:

  1. 结果未以JSON格式返回
  2. 我试图将数组转换为JSON格式,但此数组具有非utf字符

因此,每当我尝试使用json_eoncde()对返回的数组进行编码时,该函数就无法正常工作,因为其中一个索引具有非utf字符,其中大多数都是用巴西葡萄牙语单词强调的。


1
2017-11-30 06:47