gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:59:37 28 4
gpt4 key购买 nike

我使用 asp mvc 以及 jquery 和 google map API 来显示和更新 map 上的位置。

我的目标:

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

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

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

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

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

我的问题:

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

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

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

初始加载

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

注意:在测试时,我对 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。第一次更新后,标记正确刷新,但信息气泡仍然存在(我不知道如何清除它们)

就像您如何创建 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] 创建信息气泡,但是,这是未定义迭代器永远不会重置为0。

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

所有信息气泡都会保留,因为它们永远不会关闭。

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

关于javascript - 使用ajax刷新谷歌地图标记和infoBubbles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232251/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com