IE AJAX 返回 undefined

先說故事,再說想法吧。 html

我有一朋友作網站,用jQuery的Ajax方法從後端載入一段HTML代碼而後動態插入到網頁的Div元件中。這個東西太廣泛了。jQuery強大的load方法能夠完成這個事情。朋友的代碼是這麼寫的: jquery

1
2
3
vartab = jQuery("#dynamic_tab");
varurl ="/list_ajax/";
tab.load(url);

簡單到不能再簡單了。在Chrome,Firefox,Safari下運行一點問題也沒有,只有IE不行,不論是IE7,IE8,仍是IE9。問題的症壯是,使用IE訪問那個Ajax的連接,沒有問題,可是在jQuery的Ajax方法返回了「undefined」的respons對象。沒有任何報錯! 程序員

怎麼搞也搞不定,只好Google了一下——「jQuery load IE」,一看,不少人都在問這個問題。因而開始了散彈槍編程方式ajax

排在第一的就是StackOverflow被瀏覽了33K次的這個問題:jQuery’s .load() not working in IE – but fine in Firefox, Chrome and Safari,答案沒有被打勾(不靠譜),StackOverflow還有不少人問類似的問題,不過都沒有答案。無論三七二十一,先試了一下,散彈槍嘛。試了半天都沒有用。 chrome

而後上Google查,又看到有人說的IE緩存的問題,什麼,要把cache設置成false,或是用下面的方法來解決: shell

1
2
3
4
vartab = jQuery("#dynamic_tab");
varfuckie = Math.random();
varurl ="/list_ajax/"+"?fuckie="+fuckie;
tab.load(url);

反正仍是同樣,通通不Work,幾乎全部的都試了,都不Work。搞了一天的朋友惱怒道:「Microsoft應該快點倒閉吧,產品太爛了」。IE的確是太爛了。 編程

因而我用IE9的網頁調試器能夠看到點了Ajax的連接後,IE對網站有http的Ajax請求,也能夠看到請求返回了,可是就是不顯示在個人頁面上——jQuery的Ajax的responseText爲undefined! 後端

對於我這個老傢伙,對jQuery也不熟,我只得開始調試jQuery的代碼,想看看裏面幹了什麼,報了什麼錯?調了一個小時,基本上把jQuery的Ajax的封裝看懂了七七八八了,可是仍是沒找到爲何有問題。 緩存

因而,我只得架起原生態的Ajax,看看IE的那個Ajax的ActiveX的對象幹了什麼事?寫了下面的代碼(當年寫Ajax就是這麼寫的,因此也不費勁,何況網上還有例程能夠抄): 框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
functionInitAjax()
{
    varajax=false;
    try{
        ajax =newActiveXObject("Msxml2.XMLHTTP");
    }catch(e) {
        try{
            ajax =newActiveXObject("Microsoft.XMLHTTP");
        }catch(E) {
            ajax =false;
        }
    }
    if(!ajax &&typeofXMLHttpRequest!='undefined') {
        ajax =newXMLHttpRequest();
    }
    returnajax;
}
 
varajax = InitAjax();
ajax.open("GET", url,true);
ajax.onreadystatechange =function() {
    if(ajax.readyState == 4 && ajax.status == 200) {
        varshow = 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不會自動檢測)。

這個問題的緣由就是由於咱們沒有按照規範去寫網頁。因此,觸類旁通,HTML的規範還有哪些,太多了,記也記不住。但也許你會知道有一個叫 http://validator.w3.org 的網站能夠幫你校驗你網頁中的不少不規範的東西。這個工具會報不少不少錯,不少都有點吹毛求疵,不過,可讓你看看(注:今天的coolshell裝了不少插件,也被我調過一些東西,因此出錯不少,我還記得之前沒有插件沒有我定製化的樣式的時候,Wordpress一個錯都不報)。

後記

我把這個問題和過程分享出來,主要有這麼幾個目的,並拋出幾個問題,你們能夠思考一下:

1)這個問題網上有不少人都在報,可是基本上找不到答案(包括StackOverflow),因此,我分享出來,填補一下空白。

2)我相信咱們的程序員每天都在經歷這樣的事,我不知道你們在遇到這樣的事情會怎麼作?也許大多數人都在網上查各類解決方案,而後一個一個的試,直到試對了——散彈槍式的編程,呵呵。固然,大多數答案都是可能找到的。但當咱們找到答案了後,咱們還會深刻去了解這個問題的具體緣由並觸類旁通地去思考一其周邊的東西嗎

3)另外,在今天這樣N多框架,N多lib,N多開源的年代下,不知道你們有沒有失去了從零開始本身寫代碼的能力?好比上面的這個問題,不知道有多少人還會本身寫原生態的Ajax?不過,我仍是建議你們能在使用各類框架的時候,明白那些最基礎的知識,求甚解,知其然知其因此然,真的很重要。

我是從那個「吃糠的年代」過來的程序員,那時的程序員什麼都要本身幹,很辛苦,今天我和不少人說我之前的那些經歷,會被笑話,可是我從這些什麼都本身的乾的年代過的經歷,讓我受益不少。我把個人想法分享給你們,但願對你們有用。

(全文完)

相關文章
相關標籤/搜索