Google Maps Unoptimized Marker / fitBounds

时间:2016-04-17 19:35:48

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

我正在使用Selenium编写验收测试来测试使用Google Maps API的应用程序。为了测试地图标记位置I' m using un-optimized markers和唯一标题属性,我可以定位标记元素(来自Selenium,带有XPath查询)。

我遇到过一个问题,即调用google.maps.Map.fitBounds()会导致在使用未优化标记时从DOM中删除标记。为了实现这一点,你必须反复调用fitBounds()。 仅在未优化的标记时发生,并且应用程序本身按预期工作。

我已经编写了一个简短的测试脚本,可以在浏览器中复制:请运行以下内容。

我也create a fiddle

我在API文档中看不到任何相关内容。

任何帮助都会很棒。

<html>
  <head>
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js"></script>
    <style type="text/css">
    #container {
      width: 800px;
      height:500px;
    }
    </style>
  </head>
  <body>
    <button id="show">Show</button>
    <button id="hide">Hide</button>
    <div id="container"></div>
    <script type="text/javascript">

      // Repeatedly click on 'Hide' then 'Show' (8+ times sometimes).  At some point the markers disappear and not come back - even if the code for showing/hiding markers is entirely commented out.
      // The issue seems to be with the map.fitBounds() call when un-optimized markers are being used.
      // Note - un-optimized markers are needed for targeting marker HTML elements as part of an acceptance test.
      // Replicated on: 45.0.2 Firefox; 49.0.2623.112 m Chrome.

      function changeBounds(boolToggle) {
        //return; // TODO - if you add this line in the problem is fixed.
        var bounds = new google.maps.LatLngBounds();
        var latLng = boolToggle ? new google.maps.LatLng(70, 70) : new google.maps.LatLng(30, 30);
        bounds.extend(marker1.getPosition());
        bounds.extend(marker2.getPosition());
        bounds.extend(latLng);
        map.fitBounds(bounds);
      }

      var mapOptions = {
        center : { lat : 50, lng : 50 },
        zoom: 5,
      };

      var map = new google.maps.Map(document.getElementById("container"), mapOptions);

      var marker1 = new google.maps.Marker({
        position : {
          lat : 51,
          lng : 51,
        },
        title : "MARK1",
        optimized : false
      });

      var marker2 = new google.maps.Marker({
        position : {
          lat : 52,
          lng : 52,
        },
        title : "MARK2",
        optimized : false
      });

      marker1.setMap(map);
      marker2.setMap(map);

      document.getElementById('show').onclick = function() {
        //marker1.setVisible(true); // TODO - The original code was showing/hiding the markers but the issue is replicated without even doing this.
        //marker2.setVisible(true);

        changeBounds(true);
      }

      document.getElementById('hide').onclick = function() {
        //marker1.setVisible(false); // TODO - The original code was showing/hiding the markers but the issue is replicated without even doing this.
        //marker2.setVisible(false);

        changeBounds(false);
      }
    </script>
  </body>
  </html>

修改:我已将此报告为Google的错误。见https://code.google.com/p/gmaps-api-issues/issues/detail?id=9912

2 个答案:

答案 0 :(得分:4)

我不知道问题是什么,它一定是Google Maps API中的一些问题,但我找到了一个解决方案:使用pan *方法。对我来说最好的一个是使用panBy,它在地图上用x和y像素平移。移动0像素工作正常,所以只需在fitBounds修复消失标记后添加map.panBy(0,0)。

然而,这意味着失去了地图的漂亮渐变,所以我在空闲事件中使用了panBy。最终的解决方案是在创建地图后添加以下内容:

google.maps.event.addListener(map, 'idle', function() {
    map.panBy(0,0);
});

我很抱歉,但我没有足够的时间来筛选Google API以实际查看问题所在。

什么行不通:

  • marker.setMap(或任何其他属性)
  • 使标记可拖动
  • google.maps.event.trigger(地图,&#39; some_event&#39;);

相关:

答案 1 :(得分:0)

与Siderite类似,我不知道如何直接修复bug。但是,我找到的解决方法是触发&#34;调整大小&#34;地图事件:

google.maps.event.trigger(google_map, "resize");