之前一直用json2.js來作客戶端的JSON的parse和stringify,最近在看一篇文章介紹了IE8支持原生的JSON對象,並且 IE8瀏覽器自帶了JSON.parse與JSON.stringify兩個方法。不過有時候咱們在代碼JSON測試的時候,頁面卻報告說JSON未定 義。既然微軟官網上有提到過IE8已經支持了JSON對象,那怎麼還不能使用呢?java
咱們先來看看這段HTML代碼編程
<html>
<body>
<script.type="text/javascript">
alert(typeofJSON);
</script>
</body>
</html>json
原來,在IE8中使用原生JSON對象是有條件的。微軟在介紹JSON對象時也有下面的一段註釋:瀏覽器
Starting with JScript. 5.8, by default, the JScript. scripting engine supports the language feature set as it existed in version 5.7. This is to maintain compatibility with the earlier versions of the engine. To use the complete language feature set of version 5.8, the Windows Script. interface host has to invoke IActiveScriptProperty::SetProperty.服務器
Internet Explorer 8 opts into the JScript. 5.8 language features when the document mode for Internet Explorer 8 is "Internet Explorer 8 Standards" mode. For other document modes, Internet Explorer uses the version 5.7 feature set.post
JScript. 5.8 includes native JavaScript. Object Notation (JSON) support and the accessor methods for Document Object Model (DOM) prototypes.測試
因爲JSON對象是在JScript. 5.8及其之後的版本引入的,因此,默認狀況下,IE8使用的是JScript. 5.7版本,因此,原生JSON對象是沒法使用的。那麼,如何使用IE8的原生對象呢?
IE8爲了最大限度地保證瀏覽器的向後兼容性,使原先建立的網頁可以正常顯示,默認採用的是IE7的渲染引擎,同時,IE8支持多種文檔兼容性模式。具體來講有:網站
•「模仿IE8」模式將告訴 Internet Explorer 使用 <!DOCTYPE> 指令來肯定如何呈現內容。 標準模式指令將以 Internet Explorer 8 標準模式顯示,而 Quirks 模式指令將以IE5模式顯示。 與IE8模式不一樣,「模仿IE8」模式遵循 <!DOCTYPE> 指令。
•「模仿IE7」模式將告訴 Internet Explorer 使用 <!DOCTYPE> 指令來肯定如何呈現內容。 標準模式指令以 Internet Explorer 7 標準模式顯示,而 Quirks 模式指令以IE5模式顯示。 與IE7式不一樣,「模仿IE7模式」遵循 <!DOCTYPE> 指令。 對於不少網站來講,這是首選的兼容性模式。
•IE5模式呈現內容的方式如同使用了 Internet Explorer 7 的 Quirks 模式來顯示內容,這與 Internet Explorer 5 顯示內容的方式很是類似。
•IE7模式:不管頁面是否包含 <!DOCTYPE> 指令,IE7模式呈現內容的方式均如同使用了 Internet Explorer 7 的標準模式來顯示內容。
•IE8模式可最大程度地支持行業標準(包括 W3C 級聯樣式表級別 2.1 規範 和 W3C 選擇器 API),並提供對 W3C 級聯樣式表級別 3 規範(工做草案) 的有限支持。
•Edge模式將告訴 Internet Explorer 以可用的最高級別模式顯示內容。 對於 Internet Explorer 8,這等同於IE8模式。 假設 Internet Explorer 的未來版本支持更高級別的兼容性模式,那麼,設置爲 Edge 模式的頁面將以該版本支持的最高級別的模式顯示。 當使用 Internet Explorer 8 查看時,這些相同的頁面仍會以IE8模式顯示。
詳細介紹能夠參見MSDN文檔:定義文檔兼容性(http://msdn.microsoft.com/zh-cn/library/cc288325(VS.85).aspx)。
注意:X-UA-compatible 標頭不區分大小寫;不過,它必須顯示在網頁中除 title 元素和其餘 meta. 元素之外的全部其餘元素以前的標頭中。
因此,要使用IE8的原生JSON對象,能夠採起下面幾種方法:
方法1:定義<!DOCTYPE>
XML/XHTML 代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ieFans.Net:JSON測試</title>
</head>
<body>
<script.type="text/javascript">
alert(typeof JSON);
</script>
</body>
</html>
方法2:設置X-UA-compatible 標頭
XML/XHTML 代碼
<html>
<head>
<meta.http-equiv="X-UA-Compatible" content="IE=edge">
<title>ieFans.Net:JSON測試</title>
</head>
<body>
<script.type="text/javascript">
alert(typeof JSON);
</script>
</body>
</html>
或者
<html>
<head>
<meta.http-equiv="X-UA-Compatible" content="IE=8">
<title>ieFans.Net:JSON測試</title>
</head>
<body>
<script.type="text/javascript">
alert(typeof JSON);
</script>
</body>
</html>
在實際編程程序的時候,最好的辦法是進行判斷,若是不支持原生的JSON,那麼就是要json2.js提供的對象便可。
還有一個問題對我形成了困擾,就是當須要stringify的對象中包含中文時,ie8的方法會將中文轉爲unicode編碼格式,好比下面:
JScript code
var json = '{"PermID":"30","PermName":"普通員工級","Remark":"最基層員工使用的權限。"}';
var o = JSON.parse(json);
document.write(JSON.stringify(o));
會輸出以下結果:
{"PermID":"30","PermName":"\u666e\u901a\u5458\u5de5\u7ea7","Remark":"\u6700\u57fa\u5c42\u5458\u5de5\u4f7f\u7528\u7684\u6743\u9650\u3002"}
這樣的結果若是用XHR直接POST到服務器上中文會是亂碼,如今我只好不用IE8的原生對象。
不知道哪位大俠有什麼更好的辦法既能用IE8原生的對象,又能避免亂碼。
有網友提供辦法說,IE8確定不成熟要繼續打補丁的,有可能就是BUG。總不能由於客戶端瀏覽器的不一樣來影響服務器端的代碼,其實就是判斷一下XHR的數據裏是否含有十六進制\u字符,有就轉換,沒有就不轉換。