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_changedpara 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

Author: Matthieu Napoli, 2010-12-02

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() {
});
 108
Author: Matthieu Napoli,
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);
 }
 10
Author: 0x1b,
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);
    }
}()));
 5
Author: Himanshu Khurana,
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í.

 2
Author: Mau Muñoz,
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

 1
Author: Galen,
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
 1
Author: yadavr,
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