【问题标题】:How do I add same event listener to many markers and then differentiate between the markers in the listeners in Google Maps API v3?如何将相同的事件侦听器添加到许多标记,然后区分 Google Maps API v3 中侦听器中的标记?
【发布时间】:2011-12-04 01:06:40
【问题描述】:

我的 Javascript 中的许多标记都有相同的事件侦听器。如何区分此侦听器中的不同标记?我想在单击特定标记时在其他地方显示另一个标记。每个标记都有另一个标记,我在单击它时会显示它。

事件监听代码:

google.maps.event.addListener(marker, 'click', function() {
//code goes here

});

更多细节:

我有两个数组 markers1markers2 每个都有 10 个标记。我在我的地图上显示来自markers1 的 10。单击markers1[0] 标记时,我想在地图上显示markers2[0] 标记。我如何在事件监听器中知道我点击了markers1[0],现在我知道我可以使用THIS 来识别markers1[0] 但我如何在监听器中知道它是位置0 的标记在数组markers1 中,这样我也可以在数组markers2 的位置0 处显示标记?

【问题讨论】:

    标签: javascript google-maps-api-3 google-maps-markers dom-events event-listener


    【解决方案1】:

    您的意思是marker 变量是一个标记数组吗?还是您的意思是您拥有的代码对于每个标记都是重复的?因为如果是后者,那么在每次调用 addListener 时,this 指的是有问题的标记。

    cmets 后更新

    好的,那么你可以使用一个函数来循环你的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 的 for 循环,但使用 visible: false

    【讨论】:

    • 后一种情况...但是当我点击这个标记时,我想显示其他标记,如何存储附加信息?
    • 嗯..你的意思是你有几个隐藏标记,当你点击一个可见标记时,其他隐藏标记会出现?还是您指的是不同标记的信息窗口?如果是这种情况,请更新您的问题以便解释,然后我可以提供帮助.. 如果两者都不是,您是什么意思“显示其他标记”.. 因为默认情况下,标记会在您创建它们时显示并且把它们放在地图上。谢谢!顺便说一句,在这种情况下,它们是相同的 type 侦听器,但不是相同的侦听器(一个重要区别)。
    【解决方案2】:

    你可以做的是有一个外部函数来处理标记/信息窗口的添加(参见 150PoundsOfDonamite 的评论)。巧合的是,我今天写了一个blog post,展示了如何做到这一点。

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

    【讨论】:

    • 在 for 循环中你仍然会得到一个匿名函数,所以你会得到与标记一样多的函数对象。
    【解决方案3】:
    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]);
    

    像这样?希望这会有所帮助

    【讨论】:

      【解决方案4】:

      您可以轻松地将索引(或任何其他信息)添加到每个标记:

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

      【讨论】:

      • 这似乎没有在每个标记之间共享一个侦听器。相反,它似乎为每个标记创建了一个匿名侦听器。
      【解决方案5】:

      您实际上并没有为每个标记设置相同的侦听器,或者至少没有相同的处理函数;你只是有相同的代码。

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

      【讨论】:

      • 谢谢,这很有帮助。在这种情况下,我忘记了“这个”。
      • 不用担心。 'this' 在 JavaScript 中有点滑。
      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多