2012-06-14 33 views
9

Tôi đang cố gắng để Firefox 13 biến đối tượng vị trí địa lý thành chuỗi JSON, nhưng nó trả về một chuỗi trống thay vì biểu diễn chuỗi chính xác của đối tượng JSON của tôi. Tính năng này hoạt động tốt trong các phiên bản Chrome và Safari mới nhất cũng như trình duyệt Android. Dưới đây là mã của tôi: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 
} 

Trong Chrome, đây quả đầu ra một đối tượng định vị, và chuỗi này:

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

Tuy nhiên, trong Firefox 13 đầu ra chỉ là một chuỗi rỗng, mặc dù đối tượng định vị đó là in trên bảng điều khiển là tất cả các ý định và mục đích giống như đối tượng được Chrome hiển thị. Bất kỳ ý tưởng về những gì đang xảy ra ở đây? This có vẻ là một vấn đề liên quan, nhưng tôi cũng không thấy giải pháp nào. IE9 hiển thị cùng một hành vi, bằng cách này.

Trả lời

5

Điều đang xảy ra là JSON.stringify chỉ xem xét thuộc tính của đối tượng theo mặc định.

Và mỗi DOM mô tả tất cả thuộc tính DOM thực sự sống trên mẫu thử nghiệm của đối tượng.

IE và Firefox triển khai thông số chính xác bằng cách đặt các thuộc tính trên mẫu thử nghiệm. Chrome và Safari không: họ đặt thuộc tính trực tiếp lên đối tượng. Điều đó làm cho trường hợp này hoạt động, nhưng phá vỡ những thứ khác (ví dụ như khả năng móc các thuộc tính và các bộ định vị) ....

Có nói thêm các phương thức toJSON vào một số đối tượng DOM để cung cấp cho chúng hành vi hợp lý hơn cho JSON.stringify .

+3

vị trí địa lý không liên quan gì đến DOM. – user123444555621

+0

Cảm ơn! Tôi đã tìm ra cách giải quyết đơn giản là gán các thuộc tính cho một biến mới và xâu chuỗi đó, nhưng không rõ ràng tại sao nó lại làm việc trong khi mã trước đó của tôi không, mà tôi không thích. Bây giờ tôi hiểu rồi. – Daan

+1

@ Pumbaa80 Chính xác hơn, đặc tả WebIDL xác định hành vi ở đây. Nhưng cảm thấy tự do để nitpick như mong muốn! –

12

Tôi tạo ra một hàm clone để sao chép vị trí Định vị (hoặc bất kỳ khác) đối tượng thành một đối tượng sẽ được chuyển đổi thành chuỗi như mong đợi:

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

Lưu ý:Có thể không hỗ trợ loại không được sử dụng trong Geoposition loại (ví dụ ngày)

sau đó, bạn sẽ sử dụng nó như sau trong mã của bạn:

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

Hy vọng điều này sẽ giúp ai đó :)

+1

đã giúp tôi :) cảm ơn –

+0

đã giúp tôi quá: D – Zibri

+0

Tôi muốn đây là câu trả lời được chấp nhận. Tôi đã thông qua điều này ban đầu, sau đó 20 phút sau đó tìm thấy một bài đăng trên blog chỉ lại ở đây. Có thể đã cứu tôi một thời gian. –

Các vấn đề liên quan