0

我正在尝试处理来自 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');
    }
});

}

因此,整个呼叫和服务器端处理就像一个魅力一样工作,并在一切正常或错误时分别以“完成”或“失败”响应(我知道你猜对了)。现在我想在响应失败时进行一些客户端处理,但alert(msg)从未触发......我做错了什么?

编辑:我忘了说,我使用 Spring MVC 作为后端,我只是返回“失败”为@ResponseBody. 当我检查网络流时,响应正文是“失败”或“完成”。

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

4 回答 4

2

你不能 chain 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');
        }
    });
}
于 2013-06-28T11:52:16.560 回答
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 );
});

这对我有用

于 2013-06-28T11:54:03.203 回答
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 回显结果。

于 2013-06-28T11:52:01.550 回答
0

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

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

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

    Header set Access-Control-Allow-Origin "*"
    
于 2013-06-28T12:16:12.403 回答