Как добавить один и тот же прослушиватель событий ко многим маркерам, а затем провести различие между маркерами в слушателях в google maps api v3?
У меня есть один и тот же прослушиватель событий для многих маркеров в моем JavaScript. Как мне различить разные маркеры в этом слушателе? Я хочу отобразить другой маркер в другом месте при нажатии определенного маркера. У каждого маркера есть свой маркер, который я показываю, нажимая на него.
код слушателя события
google.maps.event.addListener(marker, 'click', function() {
//code goes here
});
более детально:
У меня есть 2 массива маркеров 1 и маркеров 2, каждый из которых имеет 10 маркеров. Я отображаю 10 из маркеров1 на моей карте. При нажатии маркера markers1[0] я хочу отобразить маркер markers2[0] на карте. Как мне узнать в прослушивателе событий, что я нажал на markers1[0], теперь я знаю, что могу использовать ЭТО для идентификации маркеров1 [0], но как мне узнать в слушателе, что это был маркер в позиции 0 в массиве маркеров1, чтобы я также мог отобразить маркер в позиции 0 в массиве маркеров2?
5 ответов
Вы можете легко добавить индекс (или любую другую информацию) к каждому Маркеру:
for( var i = 0; i < arrDestinations; i += 1 ) {
var marker = new google.maps.Marker({
title: arrDestinations[i].title,
position: new google.maps.LatLng(arrDestinations[i].lat, arrDestinations[i].lon),
map: map,
myIndex: i // ADDED FIELD: Each marker contains its index
)};
bindInfoWindow(marker,map,infowindow,"<p>arrDestinations[i].description + "</p>");
}
Затем в вашем обработчике событий вы можете сделать это:
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(html);
infowindow.open(map, marker);
setVisibility(marker); // ADDED
});
Функция setVisibility будет аналогична функции, предложенной 150PoundsOfDonamite выше, за исключением того, что вы знаете индекс маркера, который хотите сделать видимым:
function setVisible(marker) {
for(var i=0; i<markers1.length; i++) {
if(i==marker.myIndex) {
markers2[i].setVisible(true);
} else {
markers2[i].setVisible(false);
}
}
}
На самом деле у вас нет одинакового слушателя для каждого маркера или, по крайней мере, не одна и та же функция обработчика; у вас просто тот же код.
В JavaScript функции являются первоклассными объектами, и во всех ответах, опубликованных до сих пор, для каждого маркера создается отдельная функция. Это пустая трата памяти.
Вот то, что я думаю, вы хотите:
var myMarkerClickHandler = function() {
// use the keyword 'this' to access the marker that got clicked
console.debug('Marker for ' + this.arrDestination.title + ' got clicked!');
console.debug('Its position is ' + this.position);
}
for (i = 0; i < arrDestinations.length; i++) {
// create a marker
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(arrDestinations[i].lat, arrDestinations[i].lon),
// as @john-black says, you can add whatever properties you like to the marker
arrDestination: arrDestinations[i]
});
// add *the* event handler to this marker
google.maps.event.addListener(marker, 'click', myMarkerClickHandler);
}
function yourlistener(usedMarker)
{
// in the var usedMarker you have the reference to the single marker
}
for(var x=0;x<markers.length;x++)
(function(marker){
google.maps.event.addListener(marker, 'click',
function() { yourlistener(marker); });}
)(markers[x]);
что-то вроде этого? надеюсь это поможет
Что вы можете сделать, так это иметь внешнюю функцию, которая обрабатывает добавление маркеров / информационных окон (см. Комментарий 150PoundsOfDonamite). По совпадению сегодня я написал сообщение в блоге, которое показывает, как это сделать.
<script type="text/javascript">
function initialize() {
var i;
var arrDestinations = [
{
lat: 50.815155,
lon: -0.137072,
title: "Brighton Pier",
description: "Brighton Palace Pier dates to 1899"
},
{
lat: 50.822638,
lon: -0.137361,
title: "Brighton Pavilion",
description: "The Pavilion was built for the Prince of Wales in 1787"
},
{
lat: 50.821226,
lon: -0.139372,
title: "English's",
description: "English's Seafood Restaurant and Oyster Bar"
}
];
var myOptions = {
zoom: 15,
center: new google.maps.LatLng(50.820645,-0.137376),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var infowindow = new google.maps.InfoWindow({
content: ''
});
// loop over our array
for (i = 0; i < arrDestinations.length; i++) {
// create a marker
var marker = new google.maps.Marker({
title: arrDestinations[i].title,
position: new google.maps.LatLng(arrDestinations[i].lat, arrDestinations[i].lon),
map: map
});
// add an event listener for this marker
bindInfoWindow(marker, map, infowindow, "<p>" + arrDestinations[i].description + "</p>");
}
}
function bindInfoWindow(marker, map, infowindow, html) {
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent(html);
infowindow.open(map, marker);
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
Вы имеете в виду, что marker
переменная это массив маркеров? Или вы имеете в виду, что ваш код дублируется для каждого маркера? Потому что, если последний случай, то в каждом вызове addListener, this
относится к рассматриваемому маркеру.
Обновление после комментариев
Хорошо, тогда вы можете использовать функцию, которая просто проходит через ваш marker1
:
function setVisible(marker) {
for(var i=0; i<markers1.length; i++) {
if(marker==markers1[i]) {
markers2[i].setVisible(true);
} else {
markers2[i].setVisible(false);
}
}
}
Тогда каждое отдельное определение прослушивателя кликов будет выглядеть так:
google.maps.event.addListener(marker, 'click', function() {
setVisible(this);
});
Тем не менее, вы не хотите делать что-то подобное 10 раз, поэтому вам нужно поместить это в такой шаблон:
for(var i=0; i<marker1Data.length; i++) {
marker = new google.maps.Marker({
map: theMap,
position: marker1Data[i].latLng,
visible: true
})
marker1.push(marker);
google.maps.event.addListener(marker, 'click', (function(marker) {
return function() {
setVisible(marker);
}
})(marker));
}
куда marker1Data
это просто массив объектов LatLng, которые определяют местоположение каждого маркера в marker1
, И, конечно, для цикла для marker2
, но с visible: false
,