J'ai une carte google avec des marqueurs. Je veux que mes marqueurs soient rafraîchis lorsque la carte est déplacée/zoomée ...
Google recommande d'utiliser l'événement bounds_changed
pour cela, mais quand je déplace la carte, l'événement est déclenché pour chaque pixel que je déplace la carte. Je souhaite que la carte soit actualisée uniquement lorsque l'utilisateur a cessé de déplacer la carte, c'est-à-dire lorsqu'il a relâché le bouton de la souris après avoir fait glisser.
Comment puis je faire ça ?
Il s'avère que c'était un bug signalé: http://code.google.com/p/gmaps-api-issues/issues/detail?id=1371 .
L'équipe Google recommande d'utiliser l'événement "inactif". Par exemple :
google.maps.event.addListener(map, 'idle', function() {
});
Alors que la réponse sélectionnée est la meilleure pour la plupart des circonstances. Si vous souhaitez contrôler le retard vous-même, vous pouvez simplement utiliser quelque chose comme;
var mapupdater;
{....}
google.maps.event.addListener(map, "bounds_changed", mapSettleTime);
function mapSettleTime() {
clearTimeout(mapupdater);
mapupdater=setTimeout(getMapMarkers,500);
}
Ajoutez un délai d'expiration, qui exécute votre code 500 ms après le déclenchement de l'événement, chaque fois que l'événement se déclenche, supprimez le délai d'expiration et créez-en un nouveau.
google.maps.event.addListener(map, 'bounds_changed', (function () {
var timer;
return function() {
clearTimeout(timer);
timer = setTimeout(function() {
// here goes an ajax call
}, 500);
}
}()));
Vous devez vérifier le fonctionnement d'une fonction anti-rebond. A Nice article de Taylor Case définissez-le comme suit:
Cette fonction est conçue afin de limiter le nombre d'appels d'une fonction - les événements de défilement, les événements de déplacement de souris et les événements de pression sur une touche sont tous d'excellents exemples d'événements que nous pourrions vouloir capturer, mais peuvent être assez éprouvants si nous les capturons chaque fois fois qu'ils tirent.
Vous définissez donc la fonction quelque part dans votre code:
function debounce(fn, time) {
let timeout;
return function() {
const args = arguments;
const functionCall = () => fn.apply(this, args);
clearTimeout(timeout);
timeout = setTimeout(functionCall, time);
}
}
Ensuite, vous utilisez simplement cette fonction lors de l'ajout de votre écouteur:
google.maps.event.addListener(myMap, 'bounds_changed', debounce(() => { /* Do something here */ }, 250));
Il semble que 250 ms soit une bonne fréquence à utiliser ici.
Voici un petit extrait qui supprimera tous les appels redondants '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
essayez d'utiliser à la fois zoom_changed et dragend