Ajax成功事件不起作用


193

我有一个注册表,正在使用$.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请求的成功回调中?


2
您确定调用了成功回调吗?
rahul

您需要为第二个问题提出一个新问题。
Mike Lyons 2015年

Answers:


386

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

无论如何,您似乎都不需要在该函数中使用JSON,因此您也可以删除该dataType: 'json'行。


14
我将dataType更改为text并使其正常工作。像这样dataType:'text'
Magesh 2012年

甚至为我+1,但在不是我的代码上,我通过从服务器返回json数据来解决
albanx 2012年

4
如果dataType:未指定a,但url:结尾为,也会发生这种情况.json
davetapley13年

1
另外,在$.post别名提供json作为数据类型而没有来自服务器的实际json的情况下,不会触发success回调
baldrs

如果要发出json ajax请求,请确保将其mime-type设置为application / json。那给我带来了麻烦。
Gellweiler 2014年

19

尽管问题已经解决,但我希望可以为他人提供帮助。

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


5
这与ajax,jquery和处理程序无关。我们也可能有一条评论提醒“应该将整个代码包装在script标签中”。解释是错误的:您不必在匿名函数中包装任何东西,只要您传递它而不是调用它,命名函数就可以。此外,这具有误导性:OnSuccess在请求发送之前就已被调用,因此将其与返回任何内容的Web服务相关联是没有意义的。
fdreger 2011年

这个答案对我有帮助,但是我没有支持,您应该根据@fdreger注释更新您的答案。
Ozair Kafray 2015年

15

我尝试删除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 ... 
    }
});

9
只是对此的注释。complete不管ajax调用是否成功,总是会被调用,而success仅当Web服务器以200 OKHTTP标头响应(一切正常)时才被调用。
katalin_2003

10

在PHP文件中生成JSON格式的数据之前,请确保您没有打印(回显或打印)任何文本/数据。那可以解释为您获得-sucessfull 200 OK-,但是您的sucess事件在JavaScript中仍然失败。您可以通过检查Firebug中的POST Submit1.php中的“网络-答案”部分来验证脚本接收的内容。


这真的帮助了我。我知道这是一个旧答案,但这完全是我遇到的问题。在调试过程中使用echo或print_r,并发现它们实际上导致了错误... :)谢谢!
lennyklb

6年后,仍然可以帮助人们解决这个问题!我不会知道在其他地方看。
塔尼亚·拉斯西亚18-3-9

5

alert()在您的success回调中添加一个,以确保它完全被调用。

如果不是,那仅仅是因为即使您成功命中服务器,请求也根本没有成功。合理的原因可能是超时到期,或者您的php代码中的某些异常引发了异常。

如果尚未安装用于firefox的firebug插件,请检查AJAX回调。您将能够看到响应以及响应是否成功(200 OK)。您还可以alert()complete 回调函数中放置另一个,该回调函数必须被调用。


感谢您的回复。尝试在成功事件中发出警报,但是没有起作用。我有用于firefox的firebug插件,它确实收到了成功的(200 OK)响应,所以没有任何问题。您的意思是“您还可以在完整的回调中放入另一个alert(),这绝对应该被调用。” 非常感谢您的快速回复
-codingbbq,

2
如果您没有在中看到警报success,则说明不成功。由于响应为200 OK,因此Tatu的答复似乎是合理的,但是对于进一步的故障排除,您可以使用complete始终调用的另一个事件,无论请求是否成功(success仅在请求成功时才发生),该事件始终被调用。complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund

3

我有同样的问题。发生这种情况是因为javascript期望json返回数据中的数据类型。但是,如果您在PHP中使用echo或print,则会发生这种情况。如果您使用echo函数in php返回数据,则只需删除即可dataType : "json"


2

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

dataType: "json"

与“接受的答案”不同,我这样做后实际上解决了这个问题。


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字符,其中大多数使用巴西葡萄牙语单词来强调。


1

我试图从控制器返回字符串,但是为什么控件无法在ajax成功的情况下返回错误块

var sownum="aa";
$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : "JSON",
    url : 'updateSowDetails.html?sownum=' + sownum,
    success : function() {
        alert("Wrong username");
    },
    error : function(request, status, error) {

        var val = request.responseText;
        alert("error"+val);
    }
});

1

当查询不返回成功响应的控制器时,遇到了相同的问题,修改了控制器以返回成功消息的问题得到解决。注意使用Lavalite框架。之前:

public function Activity($id)
    {
        $data=getData();
        return
            $this->response->title('title')
                ->layout('layout')
                ->data(compact('data'))
                ->view('view')
                ->output();
    }
after code looks like:
    try {
            $attributes = $request->all();
            //do something
            return $this->response->message('')
                ->code(204)
                ->status('success')
                ->url('url'. $data->id)
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url('nothing Wrong')
                ->redirect()
        }

这对我有用


1

我有同样的问题,我用这种方法解决过:我的ajax:

event.preventDefault();
$.ajax('file.php', {
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({tab}), 
success: function(php_response){
            if (php_response == 'item') 
                {
                    console.log('it works');
                }
            }
        })

好。问题不在于json,而仅在于php响应。之前:我的php响应是:

echo 'item';

现在:

$variable = 'item';
 echo json.encode($variable);

现在我的成功开始了。PS。抱歉,如果出现问题,这是我对该论坛的第一条评论:)



0

通过以下方式添加“错误”回调(就像“成功”一样):

$.ajax({
   type: 'POST',
   url: 'submit1.php',
   data: $("#regist").serialize(),
   dataType: 'json',
   success: function() {
      $("#loading").append("<h2>you are here</h2>");
   },
   error: function(jqXhr, textStatus, errorMessage){
      console.log("Error: ", errorMessage);
   }
});

因此,就我而言,我在控制台中看到了:

Error:  SyntaxError: Unexpected end of JSON input
  at parse (<anonymous>), ..., etc.

0

您必须同时声明Success和Error回调。新增中

error: function(err) {...} 

应该解决问题


-4

成功回调有两个参数:

success: function (data, textStatus) { }

还要确保submit1.php设置正确的content-type标头:application/json


感谢您的回复。我在jquery ajax documentaion上读到了有关此内容的信息,但我无法弄清楚下一步应该如何使它正常工作...如果您能指出正确的方向,将不胜感激。这是否也意味着我应该在我的php文件中有一些特定的代码?非常感谢
–codingbbq

7
success有两个论点的事实似乎与这个问题完全无关。您可以将任意数量的参数传递给javascript函数,而不管其声明中接受了多少参数,因此,这绝对不是导致这些问题的原因,并且由于没有值data或未textStatus在成功回调中使用,因此似乎完全没有理由在函数中声明它们。
David Hedlund

JSON数据不必具有正确的内容类型标头,而只需具有JSON格式。
塔图·乌尔曼嫩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.