【问题标题】:Google Maps and Internet Explorer Javascript/JSON IssueGoogle 地图和 Internet Explorer Javascript/JSON 问题
【发布时间】:2012-02-15 15:29:33
【问题描述】:

我正在使用 Google Maps API 构建用户输入位置附近的商店位置地图。一切正常,但我想摆脱 Internet Explorer 中的错误。错误是“json.markers[i].latitude 为空或不是对象”。代码如下:

function buildGoogMapView(mrkrs,json)
{
var marker=centerLatitude=centerLongitude=startZoom=point=map="";

mrkrs.each(json.gdrcenter, function(i) {
    centerLatitude  = json.gdrcenter[i].latitude;
    centerLongitude = json.gdrcenter[i].longitude;
});

mrkrs.each(json.gdrzoom, function(i) {
    startZoom = json.gdrzoom[i].setting;
});

startZoom = Number(startZoom);

map = new GMap2(document.getElementById("mapGOOG_PlaceHolder"));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(centerLatitude, centerLongitude),startZoom);

mrkrs.each(json.markers, function(i) {
    point  = new GLatLng(json.markers[i].latitude,json.markers[i].longitude);
    marker = createMarker(point,json.markers[i].description);
    map.addOverlay(marker);
});}

这是 JSON 对象,根据要求(出于保密目的,我更改了一些值):

{"gdrzoom":[
{"setting":"7"}],
"gdrcenter":[
{"latitude":"35.5",
 "longitude":"-79.6"}],
"markers":[
{"latitude":"35.0",
 "longitude":"-78.9",
 "name":"Store",
 "description":"DESCVALUE"},
{"latitude":"36.0",
 "longitude":"-79.8",
 "name":"Store",
 "description":"DESCVALUE"},
{"latitude":"35.5",
 "longitude":"-80.8",
 "name":"Store",
 "description":"DESCVALUE"}]}

我在任何其他浏览器中都没有收到此错误,并且我知道 json 对象包含正确的信息。我还将脚本移到了页面末尾,以确保它不是那么简单(它不是)。

有什么想法吗?

【问题讨论】:

  • 使用jsonlint.com 验证json - 我怀疑它的末尾有一个额外的逗号..... IE 讨厌额外的逗号!
  • JSON 对象中没有额外的数组条目。谢谢你的想法。
  • 可以包含 json 吗?即在您的问题中发布或创建jsfiddle.net
  • 包含 JSON。希望对您有所帮助。
  • 经度和纬度值应该是数字...使用parseFloat() 进行转换 - 什么是mrkrs 即你传递给这个函数的是什么?

标签: javascript json internet-explorer google-maps google-maps-api-3


【解决方案1】:

尝试改变这个:

mrkrs.each(json.markers, function(i) {
    point  = new GLatLng(json.markers[i].latitude,json.markers[i].longitude);
    marker = createMarker(point,json.markers[i].description);
    map.addOverlay(marker);
});}

到这里:

for (var i = 0; i < json.markers.length; i++) {
    point  = new GLatLng(json.markers[i].latitude,json.markers[i].longitude);
    marker = createMarker(point,json.markers[i].description);
    map.addOverlay(marker);
}

如果这样可以消除错误,请继续阅读说明。

这是两个复杂的问题:

  1. Google 地图添加了“Array.prototype.map()”函数
  2. jQuery 的 .each() 使用“for..in”循环方法(至少有时,我认为这取决于它是否在对象上循环)

大多数浏览器在循环时会忽略“Array.prototype.map()”函数,即使使用“for..in”方法也是如此,但 Internet Explorer 会尝试在其上循环。这导致循环的最后一次迭代实际上位于“地图”函数上,该函数没有“纬度”属性,因此 IE 会抛出错误:“json.markers[i].latitude is null or not an对象”。

有关“for..in”循环的更多详细信息:Why is using "for...in" with array iteration a bad idea?

【讨论】:

  • 这不完全是,但让我找到了正确的解决方案。显然,有一个额外的数组对象,即使在控制台打印输出中也没有出现。我将循环运行到 .length - 1 并且它有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多