IE8支持JSON.stringify()吗?
我需要使用:
JSON.stringify()
这应该由Chrome,Safari和Firefox支持。 我认为IE8也支持JSON对象。 我认为IE7和6不,所以我这样做:
<!--[if lt IE 8]> <script src="http://www.json.org/json2.js"></script> <![endif]-->
所以,我认为这只会导入外部的JavaScript只有IE6和7.我看了脚本的托pipeURL,只包括IE版本小于9:
http://code.google.com/p/html5shiv/ <!--[if lt IE 9]> <script src="http://www.json.org/json2.js"></script> <![endif]-->
所以我也应该包括这个IE 8呢?
要直接回答标题中的问题,是的,IE8本机支持JSON.stringify()
。
IE8是第一个获得这种支持的IE版本,开发团队在这里详细解释了这些function: http : //blogs.msdn.com/b/ie/archive/2008/09/10/native-json -in-ie8.aspx
问题的第二部分的答案是,您需要为IE6 / IE7添加备用function。 像Modernizr这样的东西可以很容易地检查这一点。
还要注意,如果用户在IE8的兼容性视图中,JSON对象将不可用。
如果您使用IE 8尝试JSON.stringify()
,则需要确保它不能以兼容模式工作。 请参阅Internet Explorer 8中未定义的JSON对象
你需要添加
<meta http-equiv="X-UA-Compatible" content="IE=8" />
到你的页面
有一个更好的解决scheme…
这不直接回答你的问题,它提供了一个完整的解决scheme,而不是你的问题。
jquery-json库提供了一个包装器,如果可用的话,该包装器将使用本机JSON对象实现,如果不是,则返回到它自己的JSON实现。 意味着它可以在任何浏览器中工作。
以下是项目主页的使用示例:
var thing = {plugin: 'jquery-json', version: 2.3}; var encoded = $.toJSON( thing ); // '{"plugin":"jquery-json","version":2.3}' var name = $.evalJSON( encoded ).plugin; // "jquery-json" var version = $.evalJSON(encoded).version; // 2.3
使用非常简单:toJSON将JS源代码串化; evalJSON将JSONstring数据转换回JavaScript对象。
你看源头,实现是惊人的简单,但它工作得很好。 我在一些项目中亲自使用过它。
如果它在每个浏览器中都能正常工作,则无需进行浏览器检测。
您不需要使用条件来确定是否包含json2.js 。 看看源代码:
var JSON; if (!JSON) { JSON = {}; } if (typeof JSON.stringify !== 'function') { JSON.stringify = function (value, replacer, space) { // Code } } if (typeof JSON.parse !== 'function') { JSON.parse = function (text, reviver) { // Code } }
这个function首先检查JSON
已经作为一个对象存在。 如果没有,那么它创build一个新的对象来容纳JSON函数。 然后,它检查是否存在.stringify()
或.parse()
的本机实现。 如果不是,那么它创build这些function。
底线:如果一个本地实现存在,包括json2.js
将不会覆盖原生实现。 否则,它会添加该function,所以没有理由需要使用条件,除非您正在尽量减less请求。
(也可能会注意到,IE10不支持条件语句,所以我build议不要依赖它们,除非没有其他select。)
把下面的代码放在你的js文件中;
var JSON = JSON || {}; // implement JSON.stringify serialization JSON.stringify = JSON.stringify || function (obj) { var t = typeof (obj); if (t != "object" || obj === null) { // simple data type if (t == "string") obj = '"'+obj+'"'; return String(obj); } else { // recurse array or object var n, v, json = [], arr = (obj && obj.constructor == Array); for (n in obj) { v = obj[n]; t = typeof(v); if (t == "string") v = '"'+v+'"'; else if (t == "object" && v !== null) v = JSON.stringify(v); json.push((arr ? "" : '"' + n + '":') + String(v)); } return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); } }; // implement JSON.parse de-serialization JSON.parse = JSON.parse || function (str) { if (str === "") str = '""'; eval("var p=" + str + ";"); return p; };
shiv只是createElement
的HTML5元素。 它与JSON无关。 尝试从Crockford获得像json2.js这样的实际JSONparsing器。
只是为了跟进Mozilla已经为JSON对象做了一个polyfill,如果你需要它在IE兼容模式下工作的话。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
if (!window.JSON) { window.JSON = { parse: function(sJSON) { return eval('(' + sJSON + ')'); }, stringify: (function () { var toString = Object.prototype.toString; var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; }; var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'}; var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); }; var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g; return function stringify(value) { if (value == null) { return 'null'; } else if (typeof value === 'number') { return isFinite(value) ? value.toString() : 'null'; } else if (typeof value === 'boolean') { return value.toString(); } else if (typeof value === 'object') { if (typeof value.toJSON === 'function') { return stringify(value.toJSON()); } else if (isArray(value)) { var res = '['; for (var i = 0; i < value.length; i++) res += (i ? ', ' : '') + stringify(value[i]); return res + ']'; } else if (toString.call(value) === '[object Object]') { var tmp = []; for (var k in value) { if (value.hasOwnProperty(k)) tmp.push(stringify(k) + ': ' + stringify(value[k])); } return '{' + tmp.join(', ') + '}'; } } return '"' + value.toString().replace(escRE, escFunc) + '"'; }; })() }; }