Google Maps API V3 - 为所有标记添加事件监听器?

Har*_*ldo 33 google-maps google-maps-api-3

必须有一种方法可以为ALL MARKERS添加一个监听器,目前我正在使用一个感觉非常错误的循环为每个监听器添加一个监听器......

这感觉不对:

google.maps.event.addListener(unique_marker_id, 'click', function(){
    //do something with this marker...                   
});   
Run Code Online (Sandbox Code Playgroud)

Gle*_*mad 39

在这两个MarkerMarkerWithLabel的情况下,你还不如用这个关键字来引用该事件处理程序连接的对象:

google.maps.event.addListener(marker, 'click', function () {
   // do something with this marker ...
   this.setTitle('I am clicked');
});
Run Code Online (Sandbox Code Playgroud)

在这里指的是特定的标记对象.

  • 这并不能解决必须将监听器单独添加到每个标记的问题. (16认同)
  • **这**很优雅! (10认同)
  • 这跟问题没什么关系 (6认同)
  • 为什么大家都点赞?他仍在将事件应用于每个标记。 (2认同)

Jir*_*riz 30

您需要将侦听器添加到每个标记,但您可以通过例如定义类似的功能来轻松实现

function createMarker(pos, t) {
    var marker = new google.maps.Marker({       
        position: pos, 
        map: m,  // google.maps.Map 
        title: t      
    }); 
    google.maps.event.addListener(marker, 'click', function() { 
       alert("I am marker " + marker.title); 
    }); 
    return marker;  
}
Run Code Online (Sandbox Code Playgroud)

并适当地称呼它:

var m1 = createMarker(new google.maps.LatLng(...), "m1");
var m2 = createMarker(new google.maps.LatLng(...), "m2");
Run Code Online (Sandbox Code Playgroud)

或循环等


Jak*_*ade 5

我设法使用 FusionTablesLayer 做到了这一点。正确设置一切需要一些工作,但是一旦完成,即使有数千个标记,它也是超快的。

您基本上是在 Google Docs 中创建一个公共表并从您的网页中查询它。该地图是在 Google 的服务器上预先生成的,这就是它表现如此出色的原因。

完整的演示页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Google Maps Demo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  <meta charset="UTF-8">
  <style type="text/css">
    html, body, #map_canvas
    {
      margin: 0;
      padding: 0;
      height: 100%;
    }
  </style>
  <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
  <script type="text/javascript">
    function initialize() 
    {
      var denmark = new google.maps.LatLng(56.010666, 10.936890);

      map = new google.maps.Map(document.getElementById('map_canvas'), {
        center: denmark,
        zoom: 7,
        mapTypeId: 'roadmap'
      });

      layer = new google.maps.FusionTablesLayer({
        query: {
          select: 'Coordinates',
          from: '1234567'
        }
      });
      layer.setMap(map);

      google.maps.event.addListener(layer, 'click', function (event) { 
        alert('Hello World!'); });

    }
  </script>
</head>
<body onload="initialize()">
  <div id="map_canvas"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

查看这篇文章了解更多信息,“标记太多!” 作者:Google Geo API 团队的 Luke Mahe 和 Chris Broadfoot。


Bor*_*kov 5

如果您使用的是GoogleMaps v3.16或更高版本,则可以将事件处理程序添加到整个map.data图层。

var map = new google.maps.Map(document.getElementById("map-canvas"), options);
map.data.loadGeoJson('http://yourserver.com/path/to/geojson.json');
map.data.addListener('click', function(e) {
    // this - instance of the layer object, in this case - map.data
    // e.feature - instance of the feature object that initiated the event
    // e.latLng - the position of the event
});
Run Code Online (Sandbox Code Playgroud)

请参阅:https : //developers.google.com/maps/documentation/javascript/examples/layer-data-event

  • 这在 v3.34.x 中消失了,可能在当时和现在之间的某些版本中。 (2认同)

Bar*_*der 0

我设法在这里得到答案: Google Maps and Their Markers

和这里的演示: http: //jsfiddle.net/salman/bhSmf/