Google 地图 setTimeout() 无法使用 AJAX 调用
Google Maps setTimeout() not working with an AJAX call
我正在构建一个基于视口边界在地图上放置标记的网络应用程序。当用户移动地图时,标记按预期下降,但它们同时下降,我希望它们连续下降。
为了解决这个问题,我尝试使用 window.setTimeout()
(根据 Google 地图 API docs)但是我无法让它与我的一起工作通过 AJAX 调用添加到集合中的数据。
我不太确定如何在我的 JS 代码中构造 window.setTimeout() 函数,这比 Google 的示例更复杂。我已经尝试了几十种不同的变体,但都没有成功。
这里是 JavaScript:
var markers = new Set();
var marker, i;
[...]
google.maps.event.addListener(map, "bounds_changed", () => {
var lat0 = map.getBounds().getNorthEast().lat();
var lng0 = map.getBounds().getNorthEast().lng();
var lat1 = map.getBounds().getSouthWest().lat();
var lng1 = map.getBounds().getSouthWest().lng();
$.ajax({
type: 'GET',
url: '/electra/marker_info/',
data: {
'neLat': parseFloat(lat0),
'neLng': parseFloat(lng0),
'swLat': parseFloat(lat1),
'swLng': parseFloat(lng1)
},
success: function (data) {
add_markers(data, i * 200);
}
});
});
[...]
function add_markers(ajaxData, timeout) {
window.setTimeout(() => {
for (i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]),
map: map,
animation: google.maps.Animation.DROP,
})
[...]
markers.add(JSON.stringify(ajaxData[i]));
}
}
}, timeout);
}
我会这样更改您的 add_markers
函数:
function add_markers(ajaxData, timeout) {
for (let i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
let marker = new google.maps.Marker({
position: new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]),
map: map,
animation: google.maps.Animation.DROP,
})
[...]
// here you increase the delay based on current number or markers
addMarker(JSON.stringify(ajaxData[i]), timeout * markers.size);
}
}
并定义一个新函数以在需要的时间插入标记:
function addMarker(marker, interval) {
setTimeout(function() { markers.add(marker); }, interval);
}
基本上,您将 setTimeout
移动到负责实际插入标记的函数,该函数处理您从 Ajax 调用中获得的数据。
下面的行将确保第一个标记将立即插入(marker.size
为 0);将插入下一个,彼此之间的距离为 timeout
。
addMarker(JSON.stringify(ajaxData[i]), timeout * markers.size);
目前所有标记都有一个超时。
文档中有一个示例:Marker Animations With setTimeout() 其中包含一个 setMarkerWithTimeout
函数:
function addMarkerWithTimeout(position, timeout) {
window.setTimeout(() => {
markers.push(
new google.maps.Marker({
position: position,
map,
animation: google.maps.Animation.DROP,
})
);
}, timeout);
}
可以在您的代码中使用,但是您需要更改它使用的 markers
数组,因为您有一个 markers
数组包含不同的数据并且用于不同的目的(如果您不需要对 google.maps.Marker
对象的引用,您可以从该函数中删除 markers.push
)。
function add_markers(ajaxData, timeout) {
for (i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
addMarkerWithTimeout(new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]), timeout);
[...]
markers.add(JSON.stringify(ajaxData[i]));
}
}
}
我正在构建一个基于视口边界在地图上放置标记的网络应用程序。当用户移动地图时,标记按预期下降,但它们同时下降,我希望它们连续下降。
为了解决这个问题,我尝试使用 window.setTimeout()
(根据 Google 地图 API docs)但是我无法让它与我的一起工作通过 AJAX 调用添加到集合中的数据。
我不太确定如何在我的 JS 代码中构造 window.setTimeout() 函数,这比 Google 的示例更复杂。我已经尝试了几十种不同的变体,但都没有成功。
这里是 JavaScript:
var markers = new Set();
var marker, i;
[...]
google.maps.event.addListener(map, "bounds_changed", () => {
var lat0 = map.getBounds().getNorthEast().lat();
var lng0 = map.getBounds().getNorthEast().lng();
var lat1 = map.getBounds().getSouthWest().lat();
var lng1 = map.getBounds().getSouthWest().lng();
$.ajax({
type: 'GET',
url: '/electra/marker_info/',
data: {
'neLat': parseFloat(lat0),
'neLng': parseFloat(lng0),
'swLat': parseFloat(lat1),
'swLng': parseFloat(lng1)
},
success: function (data) {
add_markers(data, i * 200);
}
});
});
[...]
function add_markers(ajaxData, timeout) {
window.setTimeout(() => {
for (i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]),
map: map,
animation: google.maps.Animation.DROP,
})
[...]
markers.add(JSON.stringify(ajaxData[i]));
}
}
}, timeout);
}
我会这样更改您的 add_markers
函数:
function add_markers(ajaxData, timeout) {
for (let i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
let marker = new google.maps.Marker({
position: new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]),
map: map,
animation: google.maps.Animation.DROP,
})
[...]
// here you increase the delay based on current number or markers
addMarker(JSON.stringify(ajaxData[i]), timeout * markers.size);
}
}
并定义一个新函数以在需要的时间插入标记:
function addMarker(marker, interval) {
setTimeout(function() { markers.add(marker); }, interval);
}
基本上,您将 setTimeout
移动到负责实际插入标记的函数,该函数处理您从 Ajax 调用中获得的数据。
下面的行将确保第一个标记将立即插入(marker.size
为 0);将插入下一个,彼此之间的距离为 timeout
。
addMarker(JSON.stringify(ajaxData[i]), timeout * markers.size);
目前所有标记都有一个超时。
文档中有一个示例:Marker Animations With setTimeout() 其中包含一个 setMarkerWithTimeout
函数:
function addMarkerWithTimeout(position, timeout) {
window.setTimeout(() => {
markers.push(
new google.maps.Marker({
position: position,
map,
animation: google.maps.Animation.DROP,
})
);
}, timeout);
}
可以在您的代码中使用,但是您需要更改它使用的 markers
数组,因为您有一个 markers
数组包含不同的数据并且用于不同的目的(如果您不需要对 google.maps.Marker
对象的引用,您可以从该函数中删除 markers.push
)。
function add_markers(ajaxData, timeout) {
for (i = 0; i < ajaxData.length; i++) { //puts markers in the markers set
if(! markers.has(JSON.stringify(ajaxData[i]))) {
addMarkerWithTimeout(new google.maps.LatLng(ajaxData[i][2], ajaxData[i][3]), timeout);
[...]
markers.add(JSON.stringify(ajaxData[i]));
}
}
}