MSIE返回Ajax请求的状态码1223

18

我正在使用ajax请求(POST方法)提交表单,并检查响应的HTTP状态码以查看是否成功。

在Firefox上它运行良好,但在MSIE-8上当然不行。实际上提交是有效的,我可以检查我的服务器并确认提交已经完成,并且服务器响应了204的状态码。再次强调,Firefox正确地从请求对象中给出了204的状态码,但IE却给出了1223的状态码。

有什么想法可以在MSIE中获取准确的状态码吗?提交表单和检查响应的代码如下。

    var req = new XMLHttpRequest();
    req.open("POST", "p.php?i=" + self.__isid, true);
    //Send the proper header information along with the request
    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    req.setRequestHeader("Content-length", formdata.length);
    req.setRequestHeader("Connection", "close");

    req.onreadystatechange = function()
    {
        if(req.readyState == 4)
        {
            if(req.status == 204 || req.status == 200)
            {
                //Success. Update the feed.
                self.__postFeed.update();
                self.__form.reset();
            }
            else
            {
                //TODO: Better error handling.
                alert("Error submitting post:\n" + req.responseText);
            }
        }
    }
    req.send(formdata);

做了一些实验:如果服务器返回状态码200,则MSIE可以正常工作。但如果是204,则会给我那个疯狂的1223状态。我真的想坚持使用204,因为那是最合适的响应,所以如果有人能帮忙找出如何获得它,我将不胜感激。 - brianmearns
1个回答

36

在Windows XP SP3+上,至少在IE 8.0中,MSXML HTTP中的XMLHTTPRequest实现不能正确处理状态码为204(无内容)的HTTP响应;`status'属性的值为1223。

这是一个已知的bug,大多数基于javascript的框架都可以处理这种情况并在IE中将1223标准化为204。

因此,解决您的问题的方法如下:

// Normalize IE's response to HTTP 204 when Win error 1223.
status : (conn.status == 1223) ? 204 : conn.status,
// Normalize IE's statusText to "No Content" instead of "Unknown".
statusText : (conn.status == 1223) ? "No Content" : conn.statusText

参考资料:

Dojo - http://trac.dojotoolkit.org/ticket/2418

Prototype - https://prototype.lighthouseapp.com/projects/8886/tickets/129-ie-mangles-http-response-status-code-204-to-1223

YUI - http://developer.yahoo.com/yui/docs/connection.js.html(handleTransactionResponse)

JQuery - http://bugs.jquery.com/ticket/1450

ExtJS - http://www.sencha.com/forum/showthread.php?85908-FIXED-732-Ext-doesn-t-normalize-IE-s-crazy-HTTP-status-code-1223


1
显然,IE在这种情况下也会删除所有响应头!而且显然在IE9中也会发生...但在IE10中已经修复了。来源:http://www.enhanceie.com/ie/bugs.asp(使用ctrl + F查找1223) - Aseem Kishore
谢谢更新 :) 很好,问题终于解决了,我想知道为什么他们至少没有将修复程序回溯到IE9。 - Saket Patel
哪个部分出现问题了?你收到了什么响应状态码? - Saket Patel
2
显然,这也适用于用于VBA/Excel的MSXML2.XMLHTTP60对象。谢谢。 - Joe

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