我有一个带标记的谷歌地图。我希望在移动/缩放地图时刷新我的标记......
Google建议使用事件bounds_changed
,但是当我移动地图时,会为我移动地图的每个像素触发事件。我希望仅在用户停止移动地图时刷新地图,即在拖动后释放鼠标按钮时。
我该怎么做?
由于
答案 0 :(得分:113)
事实证明这是一个报告的错误:http://code.google.com/p/gmaps-api-issues/issues/detail?id=1371。
Google小组建议使用“空闲”活动。例如:
google.maps.event.addListener(map, 'idle', function() {
});
答案 1 :(得分:10)
虽然所选答案最适合大多数情况。如果你想自己控制延迟,你可以简单地使用像
这样的东西 var mapupdater;
{....}
google.maps.event.addListener(map, "bounds_changed", mapSettleTime);
function mapSettleTime() {
clearTimeout(mapupdater);
mapupdater=setTimeout(getMapMarkers,500);
}
答案 2 :(得分:6)
添加一个超时,在事件触发后500ms运行代码,每次事件触发清除超时并创建一个新超时。
google.maps.event.addListener(map, 'bounds_changed', (function () {
var timer;
return function() {
clearTimeout(timer);
timer = setTimeout(function() {
// here goes an ajax call
}, 500);
}
}()));
答案 3 :(得分:3)
您应该检查去抖功能的工作原理。一个不错的article by Taylor Case定义如下:
此功能的构建是为了限制a的次数 函数被调用 - 滚动事件,mousemove事件和按键 事件都是我们可能想要捕获的事件的很好的例子, 如果我们每次捕捉它们,都会非常沉重 火。
所以你在代码中的某个地方定义了这个函数:
function debounce(fn, time) {
let timeout;
return function() {
const args = arguments;
const functionCall = () => fn.apply(this, args);
clearTimeout(timeout);
timeout = setTimeout(functionCall, time);
}
}
然后在添加监听器时使用该功能:
google.maps.event.addListener(myMap, 'bounds_changed', debounce(() => { /* Do something here */ }, 250));
似乎250毫秒是一个很好的频率在这里使用。
答案 4 :(得分:1)
尝试同时使用zoom_changed和dragend
答案 5 :(得分:1)
这是一个小片段,将删除所有多余的'bound_changed'调用:
var timeout;
google.maps.event.addListener(map, 'bounds_changed', function () {
window.clearTimeout(timeout);
timeout = window.setTimeout(function () {
//do stuff on event
}, 500);
}); //time in ms, that will reset if next 'bounds_changed' call is send, otherwise code will be executed after that time is up