jQuery ajax():无法处理响应

时间:2013-06-28 11:42:24

标签: ajax jquery httpresponse

我试图从jQuery处理ajax调用的响应体,但到目前为止还没有成功。

这是我的jQuery代码:

function doAjaxClosedStatus(url, requestId, closedStatusId) {
$.ajax({
    type: "POST",
    url : url+requestId,
    data : ({
        'closedStatusId' : closedStatusId
    })
}).success(function(msg) {
    alert(msg);
    if (msg == "fail") {
        alert("test");
        $(document).append($('<div class="alert alert-error affix" data-offset-top="200">You can\'t specify a closed status if status is not set as "closed"</div>'));
        $('option:selected', '.closedStatus ').removeAttr('selected');
        $('.closedStatus option:first-child').prop('selected', 'selected');
    }
});

}

因此整个呼叫和服务器端处理工作就像一个魅力,并使用&#34;完成&#34;或者&#34;失败&#34;分别当一切都是对或错时(我知道你猜对了)。现在,当响应失败时,我想做一些客户端处理,但永远不会触发alert(msg) ... 我做错了什么?

编辑:我忘了说,我使用Spring MVC作为后端,而我只是回归&#34;失败&#34;为@ResponseBody。当我检查网络流时,响应主体是&#34;失败&#34;或者&#34;完成&#34;。

EDIT2 :我试过:

$.ajax({
    type: "POST",
    url : url+requestId,
    data : ({
        'closedStatusId' : closedStatusId
    }),
    success:function(msg) {
        alert(msg);
        if (msg == "fail") {
            alert("test");
            $(document).append($('<div class="alert alert-error affix" data-offset-top="200">You can\'t specify a closed status if status is not set as "closed"</div>'));
            $('option:selected', '.closedStatus ').removeAttr('selected');
            $('.closedStatus option:first-child').prop('selected', 'selected');
        }
    }   
});

仍然没有成功......

EDIT3 : 所以我一直在尝试这个:

function doAjaxClosedStatus(url, requestId, closedStatusId) {
$.ajax({
    type: "POST",
    url : url+requestId,
    data : ({
        'closedStatusId' : closedStatusId
    }),
    success:function(msg) {
        alert(msg);
        if (msg == "fail") {
            alert("test");
            $(document).append($('<div class="alert alert-error affix" data-offset-top="200">You can\'t specify a closed status if status is not set as "closed"</div>'));
            $('option:selected', '.closedStatus ').removeAttr('selected');
            $('.closedStatus option:first-child').prop('selected', 'selected');
        }
    }   
});

}

由于某种原因,它现在确实有效。也许这是因为我的浏览器的缓存没有被清空,因此使用我的脚本的旧版本。无论如何,现在这是正常的。除了我的DOM操作,但这不属于问题本身所以主题关闭!谢谢大家!

4 个答案:

答案 0 :(得分:2)

你不能链success,这是$ .ajax中的一个方法,你可能会想到done()

function doAjaxClosedStatus(url, requestId, closedStatusId) {
    $.ajax({
        type: "POST",
        url : url+requestId,
        data : {closedStatusId : closedStatusId}
    }).done(function(msg) {
        if ( $.trim(msg) == "fail") {
            alert("test");
            $(document).append($('<div class="alert alert-error affix" data-offset-top="200">You can\'t specify a closed status if status is not set as "closed"</div>'));
            $('option:selected', '.closedStatus ').removeAttr('selected');
            $('.closedStatus option:first-child').prop('selected', 'selected');
        }
    });
}

答案 1 :(得分:2)

var request = $.ajax({
     type: "POST",
     url : url+requestId,
     data : ({'closedStatusId' : closedStatusId});

request.done(function(msg) {
     alert("yes");
});

request.fail(function(jqXHR, textStatus) {
     alert( "Request failed: " + textStatus );
});

这对我有用

答案 2 :(得分:0)

从代码中看起来像.success函数在$ .ajax之外。

应该是这样的

$.ajax({
    type: "POST",
    url : url+requestId,
    data : ({
        'closedStatusId' : closedStatusId
    }),
.success(function(data) {
    alert(data);
    if (data == "fail") {
        alert("test");
        $(document).append($('<div class="alert alert-error affix" data-offset-top="200">You can\'t specify a closed status if status is not set as "closed"</div>'));
        $('option:selected', '.closedStatus ').removeAttr('selected');
        $('.closedStatus option:first-child').prop('selected', 'selected');
    }
});

并确保您的服务器发送一些数据..如果php回显结果。

答案 3 :(得分:0)

你的代码实际上对我有用,但我有一些理论可以解释它为什么会失败。

  1. 响应的mime类型可能导致jquery将响应误解为XML(例如),然后无法解析它。你可以通过硬编码dataType来解决这个问题。

    dataType : 'text',
    
  2. 您正在尝试连接到其他域上的服务器,因此您收到了跨浏览器脚本错误。您可以通过在服务器上设置Access-Control-Allow-Origin标头来解决此问题。一种方法是通过像这样的.htaccess文件。

    Header set Access-Control-Allow-Origin "*"