我在 Google map API v3 中的代码有问题。标记每分钟更新一次(或随时手动更新)。但我不想删除所有标记,然后再次“重新上传”,导致标记然后“闪烁”。
我们的网站中有许多影响查看标记的过滤器。因此,一次可能有 5000 个标记,1 秒后应该只有 1。
但是我怎样才能正确地做到这一点呢?有我的“addMarker”功能。
this.addMarker = function(id, object)
{
if(typeof object == 'undefined'){
return;
}
if(!this.markers[id])
{
object.marker = new google.maps.Marker({
position: new google.maps.LatLng(object.lat, object.lng),
icon: object.image
});
if((object.approved == "1" && MapApprovedControl.enabled) || object.approved == "0" && MapUnapprovedControl.enabled){
object.marker.setMap(this.canvas);
}
this.markers[id] = object;
}
else
{
if(this.markers[id].marker.getIcon() != object.image) {
this.markers[id].markers.setIcon(object.image);
}
if(this.markers[id].marker.getMap() == null){
this.markers[id].marker.setMap(this.canvas);
}
}
this.updated.push(id);
};
在“else” block 中,我将索引添加到数组中,这样我就可以找出哪些数据已经存在以及哪些标记丢失。
this.updated = [];
this.update = function()
{
if(this.updated.length > 0)
{
$.each(this.markers, function(index)
{
var exists = false;
$.each(map.updated, function(key, value){
if(index == value){
exists = true;
return;
}
});
if(!exists){
map.markers[index].marker.setMap(null);
}
});
this.updated = [];
}
};
本地图更新时,会发生这种情况:
$.getScript('/Of1dPGvNutBUMJdfGSmJKeZwWjR4MGmUVoBDhb9I/pTTegD9WefgHfx7WzNhP', function() {
map.update();
});
在此 URL 中只是“addMarker(..); addMarker(...);”
但是这个解决方案是不正确的。一旦它起作用,一旦不行 - 不知道为什么:D + 它很慢。
所以我的问题是:
- 如何正确更新标记?
- 在更新过程中,我有两个周期吗,有什么办法可以使用数组过滤器吗?
非常感谢!
编辑:我修改了代码,删除了无用之处,并将“this.updated.push(id)”移到了条件之后。这解决了有时有效有时无效的问题。尽管如此,两个周期仍然是一个问题。 (我仍然认为这不是正确的方法)
EDIT1:好的,有时仍然不起作用......通常当我得到的标记数量比以前少时。
EDIT2:好的,脚本(ajax 片段)有时未加载(可能已缓存,idk)
EDIT3:这可能是无需 2 个周期即可更新标记的最佳方法
this.update = function()
{
if(this.updated.length > 0)
{
$.each(map.markers, function(index){
if($.inArray(index, map.updated) == -1){
map.markers[index].marker.setMap(null);
}
});
this.updated = [];
}
};
但是我仍然不知道如何加载我的JS文件(如果有很多标记,那么脚本只是不读取,不写入任何错误) - pfff我不明白。
EDIT4:好的,通过添加这个(在ajax片段 - 更新中)可能可以修复
<script type="text/javascript">
function load_js()
{
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= '/Of1dPGvNutBUMJdfGSmJKeZwWjR4MGmUVoBDhb9I/pTTegD9WefgHfx7WzNhP';
head.appendChild(script);
}
load_js();
</script>
并添加“map.update();”/Of1dPGvNutBUMJdfGSmJKeZwWjR4MGmUVoBDhb9I/pTTegD9WefgHfx7WzNhP 文件中最后一行之后的行。
下一个问题是:当我们的 map 中不存在标记时,仅加载标记(嘿,这个主题就像私有(private)记事本,lel)
好吧,这可能是“无解”,我需要神的力量,待续…… 但无论如何,非常感谢您的帮助! :-))
最佳答案
您是否考虑过隐藏标记而不是为每个过滤器重新显示它们?显示所有标记,然后关闭所有不在过滤器集中的标记。这使您的代码保持干净,因为您只需输出标记一次。
关于当 id 在另一个数组中时对象中的 JavaScript 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39191924/