![](/img/trans.png)
[英]How do I add a listener to multiple markers which call the same function to display directions on click in google maps api v3
[英]How do I add same event listener to many markers and then differentiate between the markers in the listeners in Google Maps API v3?
我的 Javascript 中有许多标记的相同事件侦听器。 如何区分此侦听器中的不同标记? 我想在单击特定标记时在别处显示另一个标记。 每个标记都有另一个标记,我在点击它时显示。
事件监听器代码:
google.maps.event.addListener(marker, 'click', function() {
//code goes here
});
更多详情:
我有两个阵列markers1
和markers2
每一个具有10个标记。 我在地图上显示了来自markers1
的 10。 上点击markers1[0]
标记我想显示的markers2[0]
标记在地图上。 我怎么知道在事件监听器,我点击了markers1[0]
现在我知道我可以使用THIS
识别markers1[0]
但是我怎么在听众知道,这是在该位置0的标志在阵列markers1
使得我也可以在阵列位置0显示标记markers2
?
对于每个标记,您实际上没有相同的侦听器,或者至少没有相同的处理程序函数; 你只是有相同的代码。
在 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);
}
您可以轻松地将索引(或任何其他信息)添加到每个标记:
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);
}
}
}
你的意思是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
仅仅是定义每个标记的位置经纬度对象数组marker1
。 当然还有一个 for 循环marker2
,但visible: false
。
您可以做的是拥有一个外部函数来处理标记/信息窗口的添加(请参阅 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>
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]);
像这样的东西? 希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.