2012-06-14 12 views
9

Sto cercando di ottenere che Firefox 13 trasformi un oggetto posizione geolocalizzazione in una stringa JSON, ma restituisce una stringa vuota anziché la corretta rappresentazione stringa del mio oggetto JSON. Funziona perfettamente nelle ultime versioni di Chrome e Safari, oltre che nel browser Android. Ecco il mio codice: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 
} 

In Chrome, questo emette un oggetto geolocalizzazione, e questa stringa:

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

Tuttavia, in Firefox 13 l'uscita è solo una stringa vuota, anche se l'oggetto geolocalizzazione che è stampato sulla console è a tutti gli effetti uguale all'oggetto visualizzato da Chrome. Qualche idea su cosa sta andando storto qui? This sembra essere un problema correlato, ma non vedo nemmeno una soluzione. A proposito, IE9 mostra lo stesso comportamento.

risposta

5

Quello che succede è che JSON.stringify guarda solo le proprietà dell'oggetto per default.

E per le specifiche DOM tutte le proprietà DOM effettivamente vivono sul prototipo dell'oggetto.

IE e Firefox implementano correttamente le specifiche inserendo le proprietà sul prototipo. Chrome e Safari no: mettono le proprietà direttamente sull'oggetto. Questo fa funzionare questo caso, ma rompe altre cose (ad esempio la capacità di agganciare i getter e setter della proprietà) ...

Si parla di aggiungere metodi toJSON ad alcuni oggetti DOM per dare loro un comportamento più ragionevole per JSON.stringify .

+3

geolocalizzazione non ha nulla a che fare con DOM. – user123444555621

+0

Grazie! Ho scoperto che una soluzione alternativa è semplicemente quella di assegnare le proprietà a una nuova variabile e di imporporle, ma non mi è chiaro perché abbia funzionato mentre il mio codice precedente non funzionava, cosa che non mi piaceva. Ora capisco. – Daan

+1

@ Pumbaa80 Più precisamente, la specifica WebIDL definisce il comportamento qui. Ma sentitevi liberi di fare il pelo come desiderato! –

12

ho creato una funzione clone per clonare la posizione Geolocation (o qualsiasi altro) oggetto in un oggetto che verrà stringata come previsto:

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:potrebbe non supportare i tipi non utilizzati in Geoposizione tipo (ad es Data)

si potrebbe quindi utilizzarlo come segue nel codice:

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

Spero che questo aiuti qualcuno :)

+1

mi ha aiutato :) grazie –

+0

mi ha aiutato anche: D – Zibri

+0

Vorrei che questa fosse la risposta accettata. L'ho passato inizialmente, poi 20 minuti dopo ho trovato un post sul blog che riportava qui. Potrebbe avermi salvato un po 'di tempo. –