【问题标题】:Google Maps API V3 - add event listener to all markers?Google Maps API V3 - 向所有标记添加事件侦听器?
【发布时间】:2011-09-30 11:55:41
【问题描述】:

必须有一种方法可以将侦听器添加到所有标记,目前我正在使用感觉非常错误的循环为每个标记添加侦听器...

感觉不对:

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

【问题讨论】:

    标签: google-maps google-maps-api-3


    【解决方案1】:

    MarkerMarkerWithLabel 的情况下,您不妨使用this 关键字来引用事件处理程序所附加到的对象:

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

    this 这里指的是特定的标记对象。

    【讨论】:

    • 我认为使用“this”是正确的调用,特别是如果你忘记像我刚刚做的那样用“var”声明“marker”变量,从而使其成为全局变量并花费一个小时试图弄清楚找出为什么每个标记的点击都会返回相同的信息...
    • 这并不能解决必须将侦听器单独添加到每个标记的问题...
    • 这与问题无关
    • 为什么所有的赞成票?他仍在将事件应用于每个标记。
    • 谢谢,这对我解决另一个问题很有帮助。
    【解决方案2】:

    您需要将侦听器添加到每个标记,但您可以通过例如定义一个函数,如

    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;  
    }
    

    并适当地调用它:

    var m1 = createMarker(new google.maps.LatLng(...), "m1");
    var m2 = createMarker(new google.maps.LatLng(...), "m2");
    

    或在循环中等

    【讨论】:

    • +1 这绝对帮助了我,并且循环通过这个函数是完美的。
    • 不错的简单解决方案
    【解决方案3】:

    如果您使用的是 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
    });
    

    见:https://developers.google.com/maps/documentation/javascript/examples/layer-data-event

    【讨论】:

    • 这在 v3.34.x 中消失了,可能在当时和现在的某些版本中。
    【解决方案4】:

    我设法使用 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>
    

    查看这篇文章了解更多信息,"Too Many Markers!",作者来自 Google Geo API 团队的 Luke Mahe 和 Chris Broadfoot。

    【讨论】:

    • 链接现在失效了
    【解决方案5】:

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

    这里有一个演示: http://jsfiddle.net/salman/bhSmf/

    【讨论】:

      【解决方案6】:

      这个最简单的方法是这样的:

      google.maps.event.addListener(marker, 'click', function() {
      var marker = this;
      alert("Tite for this marker is:" + this.title);
      });
      

      【讨论】:

      • API中不存在此函数。
      【解决方案7】:

      为那些希望添加自定义标签等的搜索者扩展 Jiri 答案 purley。本着 Jiri 帖子的精神,简写版本:

          var m1 = createMarker({lat: -25.363, lng: 131.044}, "m1", "<div id=\"content\"><div id=\"siteNotice\"></div>  <h1 id=\"firstHeading\" class=\"firstHeading\">m1</h1> <div id=\"bodyContent\">Some info</div> </div>");
      
      function createMarker(pos, t, d) {
          var marker = new google.maps.Marker({       
              position: pos, 
              map: map, 
              title: t      
          }); 
          google.maps.event.addListener(marker,"click", function() { 
              alert("I am marker " + marker.title); 
          new google.maps.InfoWindow({ content: d }).open(map, marker);
      
          }); 
          return marker;  
      }
      

      删除警报,只是在那里显示动作等。与 Jiri 的信息一样,您可以添加 m2、m3 等。我认为这只是完成了一些事情。

      【讨论】:

        【解决方案8】:
        /* Note: I have a set of data, and it is named by the variable data.
         * The variable data is an array
         */
        
        //Here I get the length of the data
        var dataLength = data.length;
        
        //Then I iterate through all my pieces of data here
        //NOTICE THAT THE KEYWORD let IS SO IMPORTANT HERE
        for(let markerIterator = 0; markerIterator < dataLength; markerIterator++) {
            /* This creates a new google maps marker based on my data's latitude and 
             * longitude
             */
            var marker = new google.maps.Marker({
                position: { lat: data[markerIterator].latitude, lng: 
                data[markerIterator].longitude },
                map: map
            });
        
            google.maps.event.addListener(marker, 'click', function () {
                /* This will spit out the unique markerIterator value for each marker when 
                 * clicked. It is a unique value because I defined markerIterator with the 
                 * keyword let!
                 */
                console.log(markerIterator); 
        
                // Use the keyword this to refer to each unique marker, for example:
                map.setCenter(this.getPosition());              
            });
        }
        

        【讨论】:

        • ,为您的答案添加描述。
        【解决方案9】:

        我所做的是,在地图上添加新的marker 并将其推入markers = [] 数组之前,我只需将侦听器添加到它marker.addListener('click', () =&gt; { // Do Something here});

        完整代码:

        // Adds a marker to the map and push to the array.
            function addMarker(location) {
                var marker = new google.maps.Marker({
                    position: location,
                    icon: {
                        url: "http://maps.google.com/mapfiles/ms/icons/blue-dot.png"
                    },
                    animation: google.maps.Animation.DROP,
                    map: map
                });
                marker.addListener("click",
                    () => {
                        console.log("Marker Click Event Fired!");
                    });
                markers.push(marker);
        
            }
        

        LINK我关注了!

        我真的很难找到满足我需求的具体答案。但是这个现在和任何地方都在为我工作! 问候! :)

        【讨论】:

          【解决方案10】:
          var map;
          function initialize_map(locations) {
            var options = {
              zoom: 8,
              center: new google.maps.LatLng(59.933688,30.331879),
              mapTypeId: google.maps.MapTypeId.ROADMAP
            }
            var map = new google.maps.Map(document.getElementById("map-canvas"), options);
            var bounds = new google.maps.LatLngBounds();
            for (i = 0; i < locations.length; i++) {
              marker = new google.maps.Marker({
                position: new google.maps.LatLng(locations[i][lat], locations[i][lng]),
                map: map,
                title: locations[i][title]
              });
              set_event(marker);
              bounds.extend(marker.position);
            }
            map.fitBounds(bounds);
          }
          function set_event(marker) {
            google.maps.event.addListener(marker, 'click', function() {
              // do something with this marker ...
            });
          }
          

          【讨论】:

          • 这仍然将监听器单独添加到每个标记
          【解决方案11】:

          你可以这样做:

             function setMarkers(map, locations) {
                var image = ['circle_orange.png','circle_blue .png'];
                for (var i = 0; i < locations.length; i++) {
                  var stations = locations[i];
                  var myLatLng = new google.maps.LatLng(stations[1], stations[2]);
                  var marker = new google.maps.Marker({
                    position: myLatLng,
                    map: map,
                    icon: image[stations[3]],
                    title: stations[0],
                    zIndex: stations[3],
                    optimized: false
                  });
                  var infowindow = new google.maps.InfoWindow({
                      content: "No data available"
                  });
                  google.maps.event.addListener(marker, 'mouseover', function() {
                  infowindow.setContent("We can include any station information, for example: Lat/Long: "+ stations[1]+" , "+stations[2]);
                  infowindow.open(map, this);
                  });
                }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-04
            • 2014-12-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多