Подтвердить что ты не робот

Поддерживается ли JSON.stringify() в IE 8?

Мне нужно использовать:

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. Я посмотрел URL-адрес, где размещен script, они включаются только в том случае, если версия IE меньше 9:

http://code.google.com/p/html5shiv/
<!--[if lt IE 9]>
    <script src="http://www.json.org/json2.js"></script>
<![endif]-->

поэтому я должен включить это для IE 8 тоже?

4b9b3361

Ответ 1

Чтобы ответить на вопрос в заголовке напрямую, да, IE8 поддерживает JSON.stringify() изначально.

IE8 - это первая версия IE для получения этой поддержки, и функциональность подробно объясняется командой разработчиков: http://blogs.msdn.com/b/ie/archive/2008/09/10/native-json-in-ie8.aspx

Ответ на вторую часть вопроса: да, вам нужно будет включить альтернативные функции для IE6/IE7. Что-то вроде Modernizr позволяет легко проверить это.

Также обратите внимание, если пользователь находится в режиме совместимости в IE8, объект JSON не будет доступен.

Ответ 2

Если вы попытаетесь использовать JSON.stringify() с помощью IE 8, вам необходимо убедиться, что он не работает в режиме совместимости. См. объект JSON undefined в Internet Explorer 8

Вам нужно добавить

<meta http-equiv="X-UA-Compatible" content="IE=8" />

на страницу

Ответ 3

Там лучшее решение...

Это не дает прямого ответа на ваш вопрос, но предоставляет полное решение вашей проблемы.

Библиотека 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 преобразует строковые данные JSON обратно в объекты JavaScript.

Вы смотрите на источник, реализация на удивление проста, но работает очень хорошо. Я использовал его лично в нескольких проектах.

Нет необходимости выполнять обнаружение браузера, если он работает в каждом браузере.

Ответ 4

Вам не нужно использовать условные обозначения, чтобы определить, следует ли включать 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
    }
}

Что это значит, сначала проверьте, существует ли JSON как объект. Если нет, то он создает новый объект для размещения функций JSON. Затем он проверяет, существует ли нативная реализация .stringify() или .parse(). Если нет, то он создает эти функции.

Нижняя строка: если существует встроенная реализация, в том числе json2.js не будет перезаписывать встроенную реализацию. В противном случае он добавит эту функциональность, поэтому нет причин, по которым вам нужно использовать условные обозначения, если вы не пытаетесь минимизировать запросы.

(Можно также отметить, что IE10 не поддерживает условные операторы, поэтому я бы рекомендовал не полагаться на них, если нет альтернативы.)

Ответ 5

поместите следующий код в свой файл 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;
 };

Ответ 6

Только shiv только createElement элементы HTML5. Это не имеет никакого отношения к JSON. Попробуйте получить фактический парсер JSON, например json2.js из Crockford.

Ответ 7

Просто для того, чтобы следить за тем, чтобы Mozilla создал объект polyfill для объекта JSON, если вам нужно, чтобы он работал в режиме совместимости 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) + '"';
      };
    })()
  };
}