2012-06-20 9 views
6

un código que no tengo control sobre está anulando el objeto JSON mundial sin comprobar si ya está implementado:restaurar objeto window.JSON reemplazado

var JSON = { 
    org: "http://www.JSON.org", 
    copyright: "(c)2005 JSON.org", 
    license: "http://www.crockford.com/JSON/license.html", 
    stringify: function(a, g) { 
    ... 

El problema es que esta versión del analizador JSON es muy viejo y tiene un error, que está ensuciando mis intentos de serialización. (Otros han tenido un similar problem con esta implementación.)

¿Puedo obtener la implementación nativa del navegador? Pensé delete would work, pero no es así. Sospecho que es porque JSON es un objeto y no un method in the prototype. ¿Hay alguna otra forma de conseguirlo?

+2

Preguntas similares han aparecido recientemente. Puede crear un iframe vacío y obtener el objeto JSON de él. O incluyó una mejor biblioteca después. –

+0

ohh, un iframe vacío. Eso es muy inteligente. Seguramente esa es la respuesta? – paleozogt

+0

Tengo curiosidad de cómo se puede obtener la información del DOM del iframe, pensé que el navegador contenía el javascript de los marcos secundarios ... – jcolebrand

Respuesta

8

Puede crear un elemento iframe (que cargará about:blank y, por lo tanto, crear un nuevo contexto) y obtener un objeto JSON desde allí.

function restoreJSON() { 
    var f = document.createElement("iframe"); 
    f.style.display = "none"; 
    document.documentElement.appendChild(f); 
    window.JSON = f.contentWindow.JSON; 
    document.documentElement.removeChild(f); 
} 

about:blank se carga de forma sincrónica, por lo que no hay necesidad de esperar a que el evento load. Si bien esto no restaura el objeto JSON original, está obteniendo una caja negra idéntica.

+2

'f' debe insertarse en DOM para tener' contentWindow', pero tener 'display: none' es posible. – kay

+0

@kay Por especificación no debería, y creo que al menos la última versión de todos los navegadores sigue eso. – gsnedders

+0

Oh, la especificación lo requiere. – gsnedders

1

Dado que el código que usted no tiene control sobre es sobrescribir el original antes de venir a lo largo de la página, usted tiene dos opciones:

inyecto un iframe y agarrar el JSON de la contextWindow (como se indica en la otra respuesta a esta pregunta en el momento de esta edición), o, alternativamente, simplemente use la biblioteca JSON https://github.com/douglascrockford/JSON-js como su propia inserción. Tenga en cuenta que el uso de Crockford proporciona garantías de conformidad con varios navegadores, pero las implementaciones nativas a menudo son más rápidas.

Una alternativa si tiene la capacidad en el futuro para venir a lo largo de la página antes de que el código erróneo, es inyectar algo antes que "código que ayuda a" ofender a agarrar el objeto JSON:

<html> 
    <head> 
    <script> 
     window.myJson = window.JSON; 
    </script> 
.... 
+0

Tenga en cuenta que agregar la secuencia de comandos de Crockford a esto hará que las características faltantes se apliquen automágicamente al objeto JSON reemplazado, y una pequeña edición de su archivo le dará un nuevo objeto. – jcolebrand