2010-07-09 3 views
2

Возможно, я полностью отключаюсь от того, что я пытаюсь сделать, но я искушаюсь просто вернуться к версии 2, потому что я получил эту работу легко (но я бы хотел для мобильных устройств).API Карт Google v3 Для цикла Trouble

Я пытаюсь сгенерировать несколько маркеров и сохранить код, я поместил генерацию маркеров в цикл for, который проходит через массив маркеров (вместо них используются фактические значения (long, lat, x, x, x) в вещественном массиве).

Является ли что-то просто полностью над моей головой?

function initialize() { 
    var latlng = new google.maps.LatLng(25, 15); 
    var myOptions = { 
     zoom: 2, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 


var myMarker = new Array(); 
myMarker[0] = new Array(long,lat,x,x,x); 
myMarker[0] = new Array(long,lat,x,x,x); 
myMarker[0] = new Array(long,lat,x,x,x); 
myMarker[0] = new Array(long,lat,x,x,x); 
myMarker[0] = new Array(long,lat,x,x,x); 
myMarker[0] = new Array(long,lat,x,x,x); 
myMarker[0] = new Array(long,lat,x,x,x); 

for(var i = 0; i < myMarker.length; i++) { 
    var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(myMarker[i](1), myMarker[i](2)), 
     map: map, 
     title: myMarker[i](5) 
     }); 
    var infowindow = new google.maps.InfoWindow({content: myMarker[i](5)}); 
    google.maps.event.addListener(marker, 'click', function() { 
     infowindow.open(map,marker); 
    }); 
} 

}

Этот код работает, когда я делаю маркеры индивидуально.

+0

Благодарим за задание четкого вопроса и отправку кода! – Pointy

ответ

4

Проблема в том, что все эти функции прослушивателя используют одни и те же значения «карта» и «маркер». Вам нужно обернуть их в другой функции:

(function(map, marker) { 
    google.maps.event.addListener(marker, 'click', function() { 
    infowindow.open(map,marker); 
    }); 
})(map, marker); 

«Карта» и «маркер» переменные изменяются на каждой итерации цикла. У этих функций слушателя нет их копии, если вы явно не установили что-то подобное, как в этом примере. Таким образом, все слушатели в конечном итоге работают над последним, что касалось петли!

редактировать — на самом деле теперь, когда я перечитал код еще раз, «карта» выглядит как это не меняется, так что, вероятно, может быть выведен из моей установки (не болит ничего, хотя).

1

Хмм несколько вещей, которые я заметил, являются определениями массивов и их доступом. например

// here your defining the array, quick tip just use [] instead of new Array(); its faster, in both execution and to type :) 
var myMarker = new Array(); 

//here your defining the 1st value in the array at the 0 index 
myMarker[0] = new Array(long,lat,x,x,x); 

//but again here your overriding the first value of the array at 0 index 
myMarker[0] = new Array(long,lat,x,x,x); 

поэтому он должен выглядеть как этот

var myMarker = new Array(); 
myMarker[0] = new Array(long,lat,x,x,x); 
myMarker[1] = new Array(long,lat,x,x,x); 
myMarker[2] = new Array(long,lat,x,x,x); 
myMarker[3] = new Array(long,lat,x,x,x); 
myMarker[4] = new Array(long,lat,x,x,x); 
myMarker[5] = new Array(long,lat,x,x,x); 
myMarker[6] = new Array(long,lat,x,x,x); 

, а затем, когда вы идете для доступа к значениям в массиве вашей помощью

title: myMarker[i](5) 

Вы должны иметь, если у вас есть 5 значений в каждой маркерной матрице

title: myMarker[i][4] 

массивы в javascript индексируются на основе 0 и используют квадратные бареты [], а не круглые скобки.

редактирование: грамматические исправления :)

0

Проблема заключается в том, что существует только одна значение, и каждая итерация цикла изменяет его. Функции обработчика событий не отслеживают, какой маркер им нужен.

Правильный способ исправить это, чтобы знать, что передается в обработчик событий как this. Простое исправление:

google.maps.event.addListener(marker, 'click', function() { 
    infowindow.open(map, this); // <-- changed 'marker' to 'this' 
}); 
Смежные вопросы