Google Maps и Internet Explorer Javascript / JSON Issue - PullRequest
1 голос
/ 15 февраля 2012

Я использую API Карт Google для создания карты местоположений магазинов рядом с введенным пользователем местоположением.Все работает, но в Internet Explorer появляется ошибка, от которой я хотел бы избавиться.Ошибка в том, что «json.markers [i] .latitude имеет значение null или не является объектом».Вот код:

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 содержит правильную информацию.Я также переместил сценарий в конец страницы, чтобы убедиться, что он не такой простой (не так).

Есть идеи?

1 Ответ

1 голос
/ 16 февраля 2012

Попробуйте изменить это:

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. .each () в jQuery использует метод зацикливания "for..in" (иногда припо крайней мере, я думаю, это зависит от того, зацикливается ли он на объекте)

Большинство браузеров игнорируют функцию "Array.prototype.map ()" при зацикливании, даже при использовании метода for for., но Internet Explorer попытается зациклить его.Это приводит к тому, что последняя итерация вашего цикла фактически находится в функции «map», которая не имеет свойства «latitude», поэтому IE выдает вашу ошибку: «json.markers [i] .latitude имеет значение null или не являетсяobject ".

Более подробная информация о цикле for for in здесь: Почему использование for for in с итерацией массива - плохая идея?

...