2012-06-14 17 views
9

Estoy tratando de hacer que Firefox 13 convierta un objeto de ubicación de geolocalización en una cadena JSON, pero devuelve una cadena vacía en lugar de la representación de cadena correcta de mi objeto JSON. Esto funciona bien en las últimas versiones de Chrome y Safari, así como en el navegador de Android. Aquí está mi código:FF 13, IE 9: JSON stringify/geolocation object

if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition( 
     function (position) { 
      //Success handler 
      console.log(position); //This outputs the position object to the console 
      var gps = JSON.stringify(position); 
      console.log(gps); //This outputs an empty string! 
     }, 
     function (error) 
     { 
      //Handle error 
     }, 
     { maximumAge: 3000, timeout: 60000, enableHighAccuracy: true } 
     ); 
} 
else { 
    //Handle error 
} 

En Chrome, estas salidas de un objeto de geolocalización, y esta cadena:

"{"coords":{"latitude":XYZ,"heading":null,"accuracy":40,"altitudeAccuracy":null,"altitude":null,"longitude":XYZ,"speed":null},"timestamp":1339712284200}" 

Sin embargo, en Firefox 13, la salida es simplemente una cadena vacía, a pesar de que el objeto de geolocalización que es impreso en la consola es, a todos los efectos, el mismo que el objeto mostrado por Chrome. ¿Alguna idea sobre qué está mal aquí? This parece ser un problema relacionado, pero tampoco veo una solución allí. IE9 muestra el mismo comportamiento, por cierto.

Respuesta

5

Lo que sucede es que JSON.stringify solo mira las propiedades del objeto de forma predeterminada.

Y según las especificaciones DOM todas las propiedades DOM realmente viven en el prototipo del objeto.

IE y Firefox implementan la especificación correctamente al poner las propiedades en el prototipo. Chrome y Safari no: colocan las propiedades directamente en el objeto. Eso hace que este caso funcione, pero interrumpe otras cosas (por ejemplo, la capacidad de enganchar los get y setters) ....

Se habla de agregar métodos JSON a algunos objetos DOM para darles un comportamiento más razonable para JSON.stringify .

+3

geolocalización no tiene nada que ver con DOM. – user123444555621

+0

Gracias! Descubrí que una solución alternativa es simplemente asignar las propiedades a una nueva variable y ponerle una cadena, pero no estaba claro para mí por qué funcionó mientras que mi código anterior no, lo que no me gustó. Ahora entiendo. – Daan

+1

@ Pumbaa80 Más precisamente, la especificación WebIDL define el comportamiento aquí. ¡Pero siéntete libre de criticar como desees! –

12

he creado una función de clonación para clonar la posición Geolocalización (o cualquier otra) objeto en un objeto que se Stringified como se esperaba:

function cloneAsObject(obj) { 
    if (obj === null || !(obj instanceof Object)) { 
     return obj; 
    } 
    var temp = (obj instanceof Array) ? [] : {}; 
    // ReSharper disable once MissingHasOwnPropertyInForeach 
    for (var key in obj) { 
     temp[key] = cloneAsObject(obj[key]); 
    } 
    return temp; 
} 

Nota:no sea compatible con los tipos no se utiliza en Geoposición tipo (por ejemplo, Fecha)

a continuación, utilizarlo como sigue en su código:

var gps = JSON.stringify(cloneAsObject(position)); 

Espero que esto ayude a alguien :)

+1

me ayudó :) gracias –

+0

me ayudó también: D – Zibri

+0

Deseo que esta haya sido la respuesta aceptada. Inicialmente pasé esto, luego 20 minutos más tarde encontré una publicación de blog que señalaba aquí. Podría haberme ahorrado un tiempo. –

Cuestiones relacionadas