2012-06-14 18 views
9

Staram się, aby Firefox 13 zmienił obiekt położenia geolokalizacji na ciąg JSON, ale zwraca ciąg pusty, a nie poprawną reprezentację ciągów mojego obiektu JSON. Działa to dobrze w najnowszych wersjach Chrome i Safari, a także w przeglądarce Androida. Oto mój kod:FF 13, IE 9: JSON stringify/obiekt geolokalizacji

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 
} 

W Chrome to wysyła przedmiot geolokalizacji, a ten ciąg:

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

Jednak w Firefoksie 13 wyjście jest tylko pusty ciąg znaków, mimo że obiekt geolokalizacja to drukowane na konsoli jest do wszystkich celów tak samo jak obiekt wyświetlany przez Chrome. Jakieś pomysły na to, co się tutaj dzieje? This wydaje się być pokrewnym problemem, ale nie widzę tam również rozwiązania. I tak, IE9 wyświetla to samo zachowanie.

Odpowiedz

5

Co to jest, że JSON.stringify tylko domyślnie patrzy na właściwości obiektu.

I dla specyfikacji DOM wszystkie właściwości DOM faktycznie żyją na prototypie obiektu.

IE i Firefox implementują specyfikację poprawnie, umieszczając właściwości na prototypie. Chrome i Safari nie: umieszczają właściwości bezpośrednio na obiekcie. Sprawia to, że ten przypadek działa, ale łamie inne rzeczy (np. Możliwość przechwycenia właściwości pobierających i ustawiających) ...

Mówimy o dodawaniu do metod JSON do niektórych obiektów DOM, aby nadać im bardziej uzasadnione zachowanie dla JSON.stringify .

+3

Geolokalizacja nie ma nic wspólnego z DOM. – user123444555621

+0

Dzięki! Zorientowałem się, że obejście tego problemu polega po prostu na przypisaniu właściwości do nowej zmiennej i objaśnieniu tego, ale nie było dla mnie jasne, dlaczego to działało, podczas gdy mój wcześniejszy kod nie działał, co mi się nie podobało. Teraz rozumiem. – Daan

+1

@ Pumbaa80 Dokładniej, specyfikacja WebIDL określa zachowanie tutaj. Ale nie krępuj się! –

12

stworzyłem funkcję klonowania sklonować pozycję geolokalizacji (lub jakiegokolwiek innego) obiektu do obiektu, który będzie stringified zgodnie z oczekiwaniami:

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

Uwaga:może nie obsługiwać typy nie stosowanych w Geoposition typ (np data)

można by następnie używać go w następujący kod:

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

Mam nadzieję, że to pomoże komuś :)

+1

pomógł mi :) dzięki –

+0

pomógł mi też: D – Zibri

+0

Chciałbym, aby to była zaakceptowana odpowiedź. Najpierw przekazałem to, a 20 minut później znalazłem wpis na blogu, który wskazywał tutaj. Mogłem zaoszczędzić mi trochę czasu. –