解決在 IE 下無法將 HTML/XML 轉成 jQuery 物件的問題 。當傳回的內容是XML,若未將HttpRequest的dataType設為"xml",最後在處理XML時,會發生在Firefox上可行但在IE不成功的結果。
因為好奇,追了一下jQuery的Source Code,發現關鍵出在這裡:
httpData: function( xhr, type, filter ) {
var ct = xhr.getResponseHeader("content-type"),
xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
data = xml ? xhr.responseXML : xhr.responseText;
當dataType=="xml"時,data會傳回responseXML(一個XML DOM物件),否則傳回responseText(字串)。換句話說,當dataType沒設定成"xml"時,Firefox正確地將$("<root>...</root>")轉成了XML DOM,但IE卻沒有。
先前有一篇小文談過用jQuery解析XML, 裡面提到直接字串轉XML時,前後要加上<xml></xml>才行(我想當時的測試環境就是以IE為準),試了將字串改寫 成<xml><root></root></xml>,果然就可以在IE上成功執行。
這回我對於沒加<xml></xml>在IE裡會發生什麼事有點興趣,這部分在上次的文章中沒有深入探討,只知會失敗。於是這次我做了以下的實驗:
alert($("<root><item>Text</item></root>").size());
嘿! 有趣的地方來了,上面這段Code在IE裡會得到5(Firefox裡則是1)。然後再進一步剖析:
var o = $("<root><item>Text</item></root>");
o.each(function() { alert(this.outerHTML); });
在IE下我得到<ROOT>, <ITEM>, undefined, </ITEM>, </ROOT>五項內容,再仔細深入,Text被解析成Text Node,因此沒有outerHTML,但o[2].data就可以取得字串內容。
頗奇怪的解析結果,似乎沒什麼大用,僅滿足好奇心而已。