2012-06-14 9 views
9

Ich versuche, Firefox 13 ein Geolocation-Position-Objekt in eine JSON-Zeichenfolge zu drehen, aber es gibt eine leere Zeichenfolge anstelle der richtigen Zeichenfolgendarstellung meines JSON-Objekts. Dies funktioniert in den neuesten Versionen von Chrome und Safari sowie im Android-Browser. Hier ist mein Code:FF 13, IE 9: JSON stringify/Geolocation-Objekt

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 
} 

In Chrome, das gibt ein Geolocation-Objekt, und diese Zeichenfolge:

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

jedoch in Firefox 13 die Ausgabe nur eine leere Zeichenfolge ist, obwohl das Geolocation-Objekt, das ist Der Ausdruck auf der Konsole entspricht im Grunde dem von Chrome angezeigten Objekt. Irgendwelche Ideen, was hier schief läuft? This scheint ein verwandtes Problem zu sein, aber ich sehe dort auch keine Lösung. IE9 zeigt übrigens das gleiche Verhalten.

Antwort

5

Was passiert, ist, dass JSON.Stringify standardmäßig nur die eigenen Eigenschaften des Objekts betrachtet.

Und nach DOM-Spezifikationen leben alle DOM-Eigenschaften tatsächlich auf dem Prototyp des Objekts.

IE und Firefox implementieren die Spezifikation korrekt, indem sie die Eigenschaften auf den Prototyp setzen. Chrome und Safari nicht: Sie legen die Eigenschaften direkt auf das Objekt. Das macht diesen Fall funktioniert, aber bricht andere Dinge (z. B. die Fähigkeit, die Eigenschaft Getter und Setter haken) ....

Es ist Rede von HinzufügenJSON Methoden zu einigen DOM-Objekten, um ihnen mehr vernünftiges Verhalten für JSON.Stringify geben .

+3

Geolocation hat nichts mit DOM zu tun. – user123444555621

+0

Danke! Ich habe herausgefunden, dass ein Workaround einfach darin besteht, die Eigenschaften einer neuen Variablen zuzuordnen und sie zu stringifizieren, aber es war mir unklar, warum das funktionierte, während mein früherer Code nicht funktionierte, was ich nicht mochte. Jetzt verstehe ich. – Daan

+1

@ Pumbaa80 Genauer gesagt definiert die WebIDL-Spezifikation das Verhalten hier. Aber zögern Sie nicht, wie gewünscht! –

12

Ich habe eine Klon-Funktion die Geolokalisierung Position (oder anderes) Objekt in ein Objekt zu klonen, wie erwartet Zeichenfolge werden:

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

Hinweis:nicht Typen nicht verwendete Träger können in Geoposition Typ (zB Datum)

Sie würden dann verwenden, wie im Code folgt:

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

Hoffe, das hilft jemandem :)

+1

hat mir geholfen :) danke –

+0

hat mir auch geholfen: D – Zibri

+0

Ich wünschte, das wäre die akzeptierte Antwort. Ich übergab das zunächst, dann fand ich 20 Minuten später einen Blogeintrag, der hierhin zeigte. Hätte mich etwas Zeit sparen können. –