【发布时间】:2017-12-04 11:36:27
【问题描述】:
抱歉标题很糟糕,但我不知道该用哪种方式表达,因为我根本不知道发生了什么。
所以我有一个脚本应该每隔 X 秒清除谷歌地图地图中的所有标记,然后使用 Ajax 调用 PHP 脚本从数据库中获取所有地址,之后使用谷歌的地理编码器获取纬度这些地址的经度和经度,并将它们推送到一组标记,最后在地图上设置标记。这里的问题是它只加载了一个标记。
javascript:
var lisbon = {lat: 38.736946, lng: -9.142685};
var geocoder = new google.maps.Geocoder();
var markers = [];
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 10,
center: lisbon
});
window.setInterval(function name() {
$.ajax({
url: "/resources/scripts/php/conn/ajax/getEmployeeMap.php",
type: "GET",
dataType: 'json',
cache: false,
success: function (response) {
console.info("===Restarting markers array===");
markers = [];
console.info("===Setting markers array===");
var data = response;
var i = 1;
while (i <= Object.keys(data).length) {
geocoder.geocode({'address': data[i]}, function (results, status) {
if (status == 'OK') {
var geomarker = results[0].geometry.location;
var marker = new google.maps.Marker({
position: geomarker
});
markers.push(marker);
}
});
i++;
}
window.setInterval(function () {
console.info("===Deleting markers from the Map===")
clearMarkers();
setMapOnAll(map);
}, 10000)
}
});
}, 10000);
// Sets the map on all markers in the array.
function setMapOnAll(map) {
console.info("===Setting markers on the map===");
for (var i = 1; i < markers.length; i++) {
markers[i].setMap(map);
}
}
function clearMarkers() {
setMapOnAll(null);
}
在控制台上输出:
===重启标记数组===
===设置标记数组===
===重启标记数组===
===设置标记数组===
===从地图中删除标记===
===在地图上设置标记===
===在地图上设置标记===
来自 PHP 的 JSON:
{"1":"Lisboa, Sintra, Rua Professor Rui Luis Gomes 19, 2725-555","2":"Lisboa, Sintra, Rua Professor Rui Luis Gomes 21, 2725-555"}
其他奇怪的事情是,如果我在 ajax 完成运行和设置数组之前调用“setMapOnAll()”而没有运行间隔。
当我只使用标记设置器运行脚本时,它确实放置了 2 个标记,所以我知道它正在工作。
==更新==
新代码,现在正在运行,供将来参考(我自己和其他可能需要它的人):
var lisbon = {lat: 38.736946, lng: -9.142685};
var geocoder = new google.maps.Geocoder();
var markers = [];
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 10,
center: lisbon
});
function doMarkers() {
$.ajax({
url: "/resources/scripts/php/conn/ajax/getEmployeeMap.php",
type: "GET",
dataType: 'json',
cache: false,
success: function (response) {
clearMarkers();
var data = response;
var i = 1;
while (i <= Object.keys(data).length) {
geocoder.geocode({'address': data[i]}, function (results, status) {
if (status == 'OK') {
var geomarker = results[0].geometry.location;
var marker = new google.maps.Marker({
position: geomarker
});
marker.setMap(map);
markers.push(marker);
}
});
i++;
}
}
});
}
// Sets the map on all markers in the array.
function setMapOnAll(map) {
for (var i = 0; i < markers.length; i++) {
markers[i].setMap(map);
}
}
function clearMarkers() {
setMapOnAll(null);
markers.length = 0; //Deletes content from array.
//This line deleted the array even when setting the markers...
}
doMarkers();
setInterval(doMarkers, 10000);
这是在@TonySamperi 和@James 的帮助下重新制作的
【问题讨论】:
-
为什么不从地理编码成功回调中为每个标记调用 setMap。
-
这确实是一个非常奇怪的hacky解决方法,我会尝试成功回调,但是我如何在那里调用成功回调?抱歉,我对 javascript 太陌生了,因此我尽量避免在这个项目中使用它,但是一旦我到达项目的这一部分,与 JS 有太多的事情要做,现在我需要学习它同时xD
标签: javascript php jquery ajax google-maps-api-3