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)
希望这有助于某人:)
发生的事情是JSON.stringify默认只查看对象自己的属性.
根据DOM规范,所有DOM属性实际上都存在于对象的原型中.
IE和Firefox通过将属性放在原型上来正确实现规范.Chrome和Safari不会:他们将属性直接放在对象上.这使得这个案例有效,但打破了其他事情(例如挂钩属性getter和setter的能力)....
有人谈到将JSON方法添加到某些DOM对象,以便为JSON.stringify提供更合理的行为.
| 归档时间: |
|
| 查看次数: |
3646 次 |
| 最近记录: |