【问题标题】:Refreshing google maps markers and infoBubbles using ajax使用 ajax 刷新谷歌地图标记和 infoBubbles
【发布时间】:2016-09-10 23:08:08
【问题描述】:

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

我的目标:

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

  2. 使用信息气泡info bubble repo提供有关这些位置的少量信息

  3. OnClick 刷新标记和信息气泡

我目前取得的成就:

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

我的问题:

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

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

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

初始加载

调用 1 后(点击租借按钮)

调用 2 后(点击购买按钮)

somePartialView.cshtml

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

Javascript

注意: 在测试时,我在 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();
}
});

【问题讨论】:

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


    【解决方案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。第二次更新后,所有标记都消失了,但所有信息气泡仍然存在

    所有信息气泡仍然存在,因为它们从未关闭。

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

    【讨论】:

    • 添加了一个 clearInfoBubbles() 方法并在 successCallBack() 中添加了 markers = []; markerLatLng = []; infoBubbles = []; iterator = 0; 并且它有效,感谢您为我指明正确的方向
    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 2015-05-09
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多