Límites de eventos de Google Map cambiados activados varias veces al arrastrar
Tengo un mapa de Google con marcadores. Quiero que mis marcadores se actualicen cuando se mueva/amplíe el mapa...
Google recomienda usar el evento bounds_changed
para eso, pero cuando muevo el mapa, el evento se activa para cada píxel que muevo el mapa . Quiero que el mapa se actualice solo cuando el usuario deje de mover el mapa, es decir, cuando suelte el botón del ratón después de arrastrar.
¿Cómo puedo hacer eso ?
Gracias
6 answers
Resulta que fue un error reportado: http://code.google.com/p/gmaps-api-issues/issues/detail?id=1371 .
El equipo de Google recomienda utilizar el evento "idle". Por ejemplo :
google.maps.event.addListener(map, 'idle', function() {
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-04 12:56:26
Mientras que la respuesta seleccionada es la mejor para la mayoría de las circunstancias. Si desea controlar el retraso usted mismo, simplemente puede usar algo como;
var mapupdater;
{....}
google.maps.event.addListener(map, "bounds_changed", mapSettleTime);
function mapSettleTime() {
clearTimeout(mapupdater);
mapupdater=setTimeout(getMapMarkers,500);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-06 23:14:51
Agregue un tiempo de espera, que ejecute su código 500ms después de que se inicie el evento, cada vez que se inicie el evento, borre el tiempo de espera y cree uno nuevo.
google.maps.event.addListener(map, 'bounds_changed', (function () {
var timer;
return function() {
clearTimeout(timer);
timer = setTimeout(function() {
// here goes an ajax call
}, 500);
}
}()));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-10 14:12:20
Deberías comprobar cómo funciona una función de debounce. Un buen artículo de Taylor Case lo define como sigue:
Esta función se construye con el fin de limitar la cantidad de veces la función se llama-scroll events, mousemove events y keypress los eventos son todos grandes ejemplos de eventos que podríamos querer capturar, pero puede ser bastante agotador si los capturamos cada vez que fuego.
Así que define la función en algún lugar de su código:
function debounce(fn, time) {
let timeout;
return function() {
const args = arguments;
const functionCall = () => fn.apply(this, args);
clearTimeout(timeout);
timeout = setTimeout(functionCall, time);
}
}
Entonces solo usa esa función al agregar tu oyente:
google.maps.event.addListener(myMap, 'bounds_changed', debounce(() => { /* Do something here */ }, 250));
Parece que 250 ms es una buena frecuencia para usar aquí.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-22 15:25:39
Intente usar tanto zoom_changed como dragend
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-02 18:39:18
Aquí hay un pequeño fragmento que eliminará todas las llamadas redundantes '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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-05 13:42:40