使用者回報某段使用XHR(XMLHttpRequest)的Script在他的IE8上執行出現錯誤。

追查發現,問題出在Script中使用了xhr.timeout,而系統回報不支援,求證發現timeout屬性是IE8主打的XHR強化項目,而瀏覽器版本的確是IE8無誤。

進一步檢查,更大吃一驚! 程式碼中有段制式的跨瀏覽器XHR物件產生寫法,在遇到IE6某些早該消失在地球上的舊版瀏覽器時,可使用XMLHTTP ActiveX物件取代原生XHR:
var xhr = (window.XMLHttpRequest) ?
                 new XMLHttpRequest() : 
                 window.ActiveXObject ?  new ActiveXObject(“MSXML2.XMLHTTP.3.0”) : null;

而使用開發者工具(IE Dev Tools)的Script Console手動檢查window.XMLHttpRequest,竟得到undefined? 這意味著,這台IE8,其實一直在使用ActiveX XMLHTTP!

什麼? 不是從IE7起就內建了原生XHR? IE8什麼不好學,偏偏學起IE6早該消失在地球上的不成材哥哥,硬是堅持用ActiveX XMLHTTP權充XHR?

MSDN文件提到IE有選項可以關閉原生XHR,一查之下,果然:

理論上這個選項預設應為啟用狀況,而這部問題機器才由IE7升級至IE8,使用者並未額外去調動設定。於是再追向源頭,同一辦公室有其他同梯機器(安裝與部署時間與程序相近)還是IE7,檢查其原生XMLHTTP支援選項也是關閉的,再實測,若將該機器也升級至IE8,則在IE8中會沿用其設定,繼續停用原本XHR,解釋了選項被停用的來源。至於為什麼公司制式化部署的IE7,此選項會被關閉,則又是另一個謎,仍在分案調查中...


Comments

Be the first to post a comment

Post a comment