先扯一个故事吧:

早些时候我刚接触JavaWeb的时候,碰上了一个问题:以字符串形式在页面输出“您好中国hello”
开始我是这样写的:

response.getWriter().write("您好中国hello");

发现页面上是这样的:

这一看就是响应的编码格式问题了。
于是我查阅资料,改成了这样:

response.setCharacterEncoding("UTF-8");
response.getWriter().write("您好中国hello");

但是页面上是这样的:

这乍一看我就很懵逼了,因为按我查阅到的资料,关于响应的问题,只需在get里面(一般用get来接收)加入第一行代码,改变其编码即可。为什么错了? 我们文末再说。

我为什么放这个例子,因为最近我看到了一些问题:jQuery的Ajax的responseText为undefined!
你比如:

var tab = jQuery("#dynamic_tab");
var url = "/list_ajax/";
tab.load(url);

很简单对吧!ajax从后端接收其他页面的HTML代码。(说来也巧,最近刚刚写完一篇关于load的文章…)
但就是这段简单到不能再简单的代码,在Chrome,Firefox,Safari下运行一点问题也没有,只有IE不行,不管是IE7,IE8,还是IE9。问题的症状是,使用IE访问那个Ajax的链接,没有问题,但是在jQuery的Ajax方法返回了“undefined”的respons对象。没有任何报错!

上Google查了一下,发现解决千奇百怪,但都没有被打对勾(还未采用!),比如:有人说的IE缓存的问题,什么,要把cache设置成false,或是用下面的方法来解决:

var tab = jQuery("#dynamic_tab");
var fuckie = Math.random();
var url = "/list_ajax/"+"?fuckie="+fuckie;
tab.load(url);

诸如此类,试了好多,都差不多,无一例外地解决不了…
于是我用IE9的网页调试器,发现点了Ajax的链接后,IE对网站有http的Ajax请求,也可以看到请求返回了,但是就是不显示在我的页面上——jQuery的Ajax的responseText为undefined!
没有返回。
只能用原生JS重写一遍了:

function InitAjax()
{
    var ajax=false;
    try {
        ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            ajax = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
            ajax = false;
        }
    }
    if (!ajax && typeof XMLHttpRequest!='undefined') {
        ajax = new XMLHttpRequest();
    }
    return ajax;
}
 
var ajax = InitAjax();
ajax.open("GET", url, true);
ajax.onreadystatechange = function() {
    if (ajax.readyState == 4 && ajax.status == 200) {
        var show = document.getElementById("HaoChenDIV").value;
        show.innerHTML = ajax.responseText;
    }
}
ajax.send(null);

一运行,还是不行,没见IE报什么错,不过,可以确定这不是jQuery的问题了。调试中,在IE9下调式发现原生的IE的Ajax对象在onreadystatechange函数里,其responseText是下面这个样子:

什么是“系统错误: -1072896658”?上google一查,一堆页面,基本上是说乱码了,也就是ajax的后端程序返回的网页编码不认识吧。需要在返回的http header里加上 charset=utf-8。

于是,修改后端的Ajax的程序,明确指定了返回的HTTP Header中的charset,于是IE下就工作正常了,再切回jQuery的load代码,一切正常了。(后端的程序本来是utf-8的编码格式,但是不骨明确在HTTP Header中指定,但是只有IE不会自动检测)

那么,开头的那个问题也就迎刃而解了:

response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("您好中国hello");

更多推荐

jQuery的Ajax的responseText为undefined!