2010-07-24 21 views
56

muszę używać:Czy JSON.stringify() jest obsługiwany przez IE 8?

JSON.stringify() 

które powinny być wspierane przez Chrome, Safari i Firefox. Myślę, że IE8 ma również wsparcie dla obiektu JSON. Myślę, IE7 i 6 nie robić, więc robię to:

<!--[if lt IE 8]> 
    <script src="http://www.json.org/json2.js"></script> 
<![endif]--> 

tak, myślę, że to będzie importować zewnętrznego JavaScript tylko, jeśli IE6 & 7. Spojrzałem na URL, gdzie skrypt jest obsługiwany, ale są uwzględniane tylko wtedy, gdy wersja IE jest mniejsza niż 9:

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

więc powinienem uwzględnić to również dla IE 8?

+14

json.org/json2.js, jak to obiecał w kodzie źródłowym, jest wielkim tłuszczu 404. Można użyć tego CDN jeśli nie można sobie zorganizować json2.js : http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js – tjp

+3

@ user246114 - Czy możesz zaznaczyć odpowiedź jako poprawną. Dzięki. – Lee

+0

Dla potrzebujących plik źródłowy znajduje się teraz tutaj: https: //raw.githubusercontent.com/douglascrockford/JSON-js/master/json2.js – hussfelt

Odpowiedz

3

Shiv tylko createElement to elementy HTML5. To nie ma nic wspólnego z JSON. Spróbuj uzyskać prawdziwy parser JSON, taki jak json2.js z Crockford.

+0

Zgadzam się, że parser JSON jest najlepszy. –

+1

Ok to powyższe użycie jest poprawne - wskazałem prawidłowy plik js, ale myślę, że jest to konieczne dla IE8? Czy też trzeba to uwzględnić tylko w IE6 i IE7? Dzięki – user246114

65

Aby odpowiedzieć bezpośrednio na pytanie w tytule, tak IE8 obsługuje natywnie JSON.stringify().

IE8 jest pierwsza wersja IE, aby uzyskać to wsparcie, a funkcjonalność jest szczegółowo wyjaśnione przez zespół dev tutaj: http://blogs.msdn.com/b/ie/archive/2008/09/10/native-json-in-ie8.aspx

odpowiedź drugą część pytania, tak trzeba byłoby to alternatywna funkcjonalność dla IE6/IE7. Coś jak Modernizr może ułatwić to sprawdzenie.

Należy również pamiętać, że jeśli użytkownik jest w widoku zgodności w IE8, obiekt JSON nie będzie dostępny.

+0

jest to poprawna odpowiedź, ale bardziej ogólnie polecam, patrząc na [YepNopeJS] (http://yepnopejs.com/) lub [Modernizr] (http://www.modernizr.com/), aby sprawdzić dla warunkowo ładując bibliotekę json. –

+11

Należy również zauważyć, że jeśli użytkownik jest w widoku zgodności, obiekt JSON nie będzie dostępny. – Dave

+0

Dzięki @nickk_can i Dave, zaktualizowałem na podstawie Twoich komentarzy. – Lee

31

Jeśli spróbujesz użyć JSON.stringify() przy użyciu IE 8, upewnij się, że nie działa w trybie zgodności. Zobacz JSON object undefined in Internet Explorer 8

Musisz dodać

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

na swojej stronie

9

Nie trzeba używać warunkowe celu ustalenia, czy zawierają json2.js czy nie. Spójrz na kod źródłowy:

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 
    } 
} 

Co to robi to najpierw sprawdzić, czy JSON już istnieje jako obiekt. Jeśli nie, tworzy nowy obiekt do funkcji JSON. Następnie sprawdza, czy istnieje natywna implementacja .stringify() lub .parse(). Jeśli nie, tworzy te funkcje. Konkluzja: jeśli istnieje natywna implementacja, w tym json2.js nie zastąpi natywnej implementacji. W przeciwnym razie doda tę funkcjonalność, więc nie ma powodu, aby używać warunków warunkowych, chyba że próbujesz zminimalizować liczbę żądań.

(Może być również zauważyć, że IE10 nie obsługuje instrukcji warunkowych, więc polecam przed opierając się na nich, chyba że nie ma żadnej alternatywy.)

+2

Oczywiście możesz nie chcieć dodatkowej prośby w przypadkach, gdy nie zostanie to zinwentaryzowane z jakimś opakowaniem aktywów. – gtd

+0

Jeśli _IE10 nie obsługuje instrukcji warunkowych_, czy nie zobaczy tych wierszy wysłanych przez OP jako tylko komentarz? czego mi brakuje? –

+0

@ ClodoaldoNeto Tak, to prawda. Ale generalnie ludzie polegali na oświadczeniach warunkowych, aby uwzględnić odchylenia w implementacji standardów Internet Explorera. IE10 i nowsze wersje nie obsługują już warunków warunkowych, więc komentarz był związany z wykorzystaniem przez PO warunków warunkowych. Moja odpowiedź brzmi: json2.js, warunki nie są wymagane, ponieważ nie zastąpią natywnych metod, z zastrzeżeniem, że programiści muszą oderwać się od warunków dla Internet Explorera dla przyszłych wersji. – saluce

16

Jest to lepsze rozwiązanie. ..

Nie odpowiada to bezpośrednio na twoje pytanie, ale zapewnia kompletne rozwiązanie problemu.

Biblioteka jquery-json zapewnia owijkę, która korzysta z natywnego realizację obiektu JSON, jeśli jest ona dostępna i opada z powrotem do własnej realizacji JSON, jeśli tak nie jest. Oznacza to, że zadziała w dowolnej przeglądarce.

Oto przykład korzystanie ze strony głównej Projektu:

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 

Użycie jest bardzo proste: toJSON stringifies źródło JS; evalJSON konwertuje dane ciągów JSON z powrotem do obiektów JavaScript.

Spójrz na źródło, wdrożenie jest zaskakująco proste, ale działa bardzo dobrze. Użyłem go osobiście w kilku projektach.

Nie ma potrzeby wykrywania przeglądarki, jeśli działa ona w każdej przeglądarce.

+0

Nie jestem pewien, co było downwocie. To jest tylko polifill JS dla wsparcia JSON, który wraca do JSON.stringify, jeśli przeglądarka go obsługuje. –

+0

Wycofuję komentarz.wspominałem, że mamy już bibliotekę. – naveen

+0

Tak, nie zdawałem sobie z tego sprawy przed dodaniem odpowiedzi. TIL, tak myślę. –

8

umieścić następujący kod w pliku 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; 
}; 
1

Wystarczy śledzić Mozilla podjęła PolyFill dla obiektu JSON, jeśli jest to potrzebne do pracy w trybie zgodności 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) + '"'; 
     }; 
    })() 
    }; 
} 
Powiązane problemy