JQuery中 JSON 兼容性问题(针对ie8)

最近遇到了JSON.parse使用时一直报未定义,浏览器是ie 8 ,改为兼容模式就能够了,如下这篇文章详细解释了这点javascript

出处:http://www.iefans.net/ie8-json-jiexi/html

 

IE8中的原生JSON对象如何使用以及解析?

 
 

之前一直用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字符,有就转换,没有就不转换。

相关文章
相关标签/搜索