【茶包射手日記】再遇IE8內建JSON null問題
2 |
同事回報我的一個網頁會出現Javascript錯抓資料成"null"(不是null,而是四個字元的字串--"null”)的問題。幾經測試後發現,在其他同事及我的IE8、使用者的IE6/7測試都OK,唯獨同事的IE8會出問題。
深入追查後抓到問題根源,有段程式去用$("#X”).attr(“attr”)抓取<input id=”X” attr=”” />的屬性,經過JSON.stringify時,在同事的IE8上會傳回"null”,IE6/7因為未內建JSON,靠JSON2.js處理,會傳回"",而我的IE8也傳回""。比對了IE8版本,我的是8.0.7600.16385,同事的則是8.0.6001.18372,看來是IE8的版本差異導致行為不同。想起去年我抓過這個Bug,也通報給到Microsoft Connect確認,看來是在後來版本已修正了,同事IE8的版號較古老,或許是造成問題的原因。
關於此一Bug,普遍建議的解法是加上Replacer Function:
var replacer = function(k,v) { return (v == null || v==="") ? "" : v};
var jsonAsStr = JSON.stringify(value, replacer);
對程式做了修改,問題算是排除了。
我在噗浪上做了小民調,想確認會出問題的版號,目前蒐集到兩則回饋(感謝星寂、Vexed回報):
結果正常的版號: 8.0.7600.16385, 8.0.6001.18702IC, 9.0.7930.16406(IE9 Beta看起來是也OK)
傳回"null"的版號: 8.0.6001.18372, 8.0.6001.18702(Ken提供)
我做了一個測試網頁,使用IE8的朋友可以玩看看,若發現版號與測試結果與上述不同,可再留言跟大家分享。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>TEST IE8 JSON</title>
<script type="text/javascript"
src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js?WT.mc_id=DOP-MVP-37580"></script>
<script type="text/javascript">
$(function () {
$("body").append("<input id='X' myAttr='' />");
if (!JSON)
alert("No Native JSON found!");
else
alert(JSON.stringify($("#X").attr("myAttr")));
});
</script>
</head>
<body>
</body>
</html>
另外,有一點注意事項 -- 要應用IE8的Native JSON,必須明確宣告<!DOCTYPE >,才適用IE8標準模式。(謝謝噗友ben補充,另外在點部落有篇IE8修練文章對IE8的三種模式有完整介紹,大家也可參考)。
Comments
# by Ken
我的IE8會傳回"null" 版本是 8.0.6001.18702
# by Ike
我的 IE8 傳回 "",版本: 8.0.6001.18702 跟樓上一樣,結果不同