使用ajax刷新谷歌地图标记和infoBubbles

时间:2016-05-14 21:49:54

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

我正在使用asp mvc以及jquery和google maps api来显示和更新地图上的位置。

我的目标:

  1. 使用标记指向多个位置

  2. 使用信息气泡info bubble repo

  3. 提供有关这些位置的少量信息
  4. OnClick刷新标记和信息气泡

  5. 到目前为止我取得的成就:

    我可以加载地图,放置指针并显示信息气泡。经过几个小时的挣扎之后,我还设法在进行ajax调用时刷新标记。

    我的问题:

    1. 第一次更新后,标记会正确刷新,但信息气泡仍然存在(我无法弄清楚如何清除它们)

    2. 新气泡与新标记一起显示但这些气泡不包含任何数据

    3. 第二次更新后,所有标记都会消失,但所有信息气泡仍然存在

    4. 初始加载

      initial load of page

      致电1后(点击租借按钮)

      after call 1

      致电2(点击购买按钮)

      after call 2

      somePartialView.cshtml

      @Html.HiddenFor(m => m.LatLng, new { @id = "latLng" })
      <div id="map" class="google-maps">
          <div id="map-canvas"></div>
      </div>
      

      的Javascript

      NB:在测试时我很难对viewModel中的lat和lng值进行编码,所以我知道每次调用时只会返回四个值,这就是为什么我有四个硬编码的原因字符串到contentString数组。

      $(document).ready(function () {
      var map;
      var iterator = 0;
      var markers = [];
      var markerLatLng = [];
      
      var contentString = [
          '<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-1.png" alt=""/><span>Sarkkara Villa</span></a></div>',
          '<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-2.png" alt=""/><span>Sarkkara Flat</span></div>',
          '<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-3.png" alt=""/><span>Sarkkara Commercial</span></div>',
          '<div class="infobox-inner"><a href="08_Properties_Single.html"><img src="assets/img/icon-4.png" alt=""/><span>Sarkkara Appartment</span></a></div>'
      ];
      var latlng = $("#latLng").val();
      var aryOfLatLng = latlng.split(';');
      
      loadMarkers(aryOfLatLng);
      
      function loadMarkers(ary) {
          $.each(ary, function (index, value) {
              if (value !== "") {
                  var values = value.split(',')
                  var loc = new google.maps.LatLng(Number(values[0]), Number(values[1]));
                  markerLatLng.push(loc);
              }
          })
      }
      
      function initialize() {
          map = new google.maps.Map(document.getElementById('map-canvas'), {
              scrollwheel: false,
              zoom: 12,
              center: new google.maps.LatLng(52.520816, 13.410186) //Berlin
          });
          setTimeout(function () {
              drop();
          }, 1000);
      
      }
      
      // animate markers
      function drop() {
          for (var i = 0; i < markerLatLng.length; i++) {
              setTimeout(function () {
                  addMarker();
              }, i * 400);
          }
      }
      
      function addMarker() {
          var marker = new google.maps.Marker({
              position: markerLatLng[iterator],
              map: map,
              icon: 'assets/img/marker.png',
              draggable: false
              //,animation: google.maps.Animation.DROP
          });
          markers.push(marker);
      
          var infoBubble = new InfoBubble({
              map: map,
              content: contentString[iterator],
              position: markerLatLng[iterator],
              disableAutoPan: true,
              hideCloseButton: true,
              shadowStyle: 0,
              padding: 0,
              borderRadius: 3,
              borderWidth: 1,
              borderColor: '#74d2b2',
              backgroundColor: '#ffffff',
              backgroundClassName: 'infobox-bg',
              minHeight: 35,
              maxHeight: 230,
              minWidth: 200,
              maxWidth: 300,
              arrowSize: 5,
              arrowPosition: 50,
              arrowStyle: 0
          });
      
          setTimeout(function () {
              infoBubble.open(map, marker);
          }, 200);
      
          google.maps.event.addListener(marker, 'click', function () {
              if (!infoBubble.isOpen()) {
                  infoBubble.open(map, marker);
              }
              else {
                  infoBubble.close(map, marker);
              }
          });
      
          iterator++;
      }
      
      google.maps.event.addDomListener(window, 'load', initialize);
      
      $("#rent").click(function () {
          ajaxRequest("/Map/_IsForSale", false)
      })
      
      $("#buy").click(function () {
          ajaxRequest("/Map/_IsForSale", true)
      })
      
      function ajaxRequest(targetUrl, data) {
          $.ajax({
              cache: false,
              url: targetUrl,
              type: "POST",
              data: { 'isForSale': data },
              success: function (data) {
                  successCallBack(data);
              },
              error: function (request, status, error) {
                  alert(error)
              }
          });
      }
      
      // Removes the markers from the map, but keeps them in the array. It will hide all markers.
      function clearMarkers() {
          for (var i = 0; i < markers.length; i++) {
              markers[i].setMap(null);
          }
      }
      
      function successCallBack(data) {
          clearMarkers();
          var latlng = data.substring(data.indexOf("value=") + 7, data.indexOf(";\""));
          var ary = latlng.split(';');
          $.each(ary, function (index, value) {
              if (value !== "") {
                  var values = value.split(',')
                  var loc = new google.maps.LatLng(Number(values[0]), Number(values[1]));
                  markerLatLng.push(loc);
              }
          })
          drop();
      }
      });
      

1 个答案:

答案 0 :(得分:1)

<强> 1。第一次更新后,标记正确刷新,但信息气泡仍然存在(我无法弄清楚如何清除它们)

就像您创建markers数组以存储创建的标记一样,以便稍后使用#clearMarkers清除。我会对infoBubbles做类似的事,例如#clearInfoBubbles。创建一个infoBubbles数组来存储信息气泡。根据信息气泡存储库中的源代码(see line 968),您可以使用InfoBubble#close关闭信息气泡。必要时致电#clearInfoBubbles。在你的#successCallBack或许。

<强> 2。新气泡与新标记一起显示但这些气泡不包含任何数据

您正在此处创建infoBubble

var infoBubble = new InfoBubble({
  map: map,
  content: contentString[iterator],
  ...
});
带有contentString

,它只被硬编码为4个元素长。

#initialize完成时,iterator将等于4.随后调用#addMarker(点击第一个租借按钮时)将尝试创建信息泡泡但是,contentString[4]undefinediterator永远不会重置为0.

第3。第二次更新后,所有标记都会消失,但所有信息气泡仍然存在

所有信息泡沫仍然存在,因为它们永远不会关闭。

我不确定您的“购买”请求是什么回馈给您。我会检查响应是否正在返回您期望的数据。我的猜测是,此时没有创建新标记。