FF 13,IE 9:JSON stringify/geolocation对象

Daa*_*aan 11 javascript firefox json geolocation internet-explorer-9

我试图让Firefox 13将地理定位位置对象转换为JSON字符串,但它返回一个空字符串而不是我的JSON对象的正确字符串表示形式.这在最新版本的Chrome和Safari以及Android浏览器中运行良好.这是我的代码:

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
}
Run Code Online (Sandbox Code Playgroud)

在Chrome中,这会输出一个地理位置对象,以及此字符串:

"{"coords":{"latitude":XYZ,"heading":null,"accuracy":40,"altitudeAccuracy":null,"altitude":null,"longitude":XYZ,"speed":null},"timestamp":1339712284200}"
Run Code Online (Sandbox Code Playgroud)

然而,在Firefox 13的输出仅仅是一个空字符串,即使该集团的印刷到控制台地理位置对象是所有意图和目的相同,由Chrome显示的对象.关于这里出了什么问题的任何想法?似乎是一个相关的问题,但我也没有看到解决方案.顺便说一句,IE9显示相同的行为.

Mar*_*eld 20

我创建了一个克隆函数来将Geolocation位置(或任何其他)对象克隆到一个对象中,该对象将按预期进行字符串化:

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;
}
Run Code Online (Sandbox Code Playgroud)

注意: 可能不支持Geoposition类型中未使用的类型(例如Date)

然后,您将在代码中使用它,如下所示:

var gps = JSON.stringify(cloneAsObject(position)); 
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人:)


Bor*_*sky 6

发生的事情是JSON.stringify默认只查看对象自己的属性.

根据DOM规范,所有DOM属性实际上都存在于对象的原型中.

IE和Firefox通过将属性放在原型上来正确实现规范.Chrome和Safari不会:他们将属性直接放在对象上.这使得这个案例有效,但打破了其他事情(例如挂钩属性getter和setter的能力)....

有人谈到将JSON方法添加到某些DOM对象,以便为JSON.stringify提供更合理的行为.

  • 地理定位与DOM无关. (3认同)
  • Chrome已经"正确"实现了此功能,现在它的位置和坐标也不再串联. (2认同)