Catégorie : Google Maps

[Javascript] Eviter qu’une callback function possédant un paramètre et invoquée via un EventListener click ne s’exécute immédiatement

(comprendre: sans que l’utilisateur n’ait cliqué au préalable).

J’ai rencontré ce souci en cherchant à ajouter un addEventListener 'click' à des markers que je créais dans ma fonction pour les placer sur une Google Maps.

Avec la déclaration suivante, la fonction invoquée ci-dessous en clickCallback était exécutée immédiatement:

Pour pallier à mon problème, j’ai dû déclarer mon événement comme suit:

Le code complet pour une vision plus globale:

La fonction dans laquelle j’initialise mon eventListener:

L’exécution de cette fonction:

La callback function:

[Javascript][Google Maps v3] Eviter une boucle infinie en exécutant un événement seulement si il n’a pas été invoqué dans les dernières x secondes

Problème: des événements de l’API Google Maps v3 comme bounds_changed, zoom_changed, idle se déclenchent à chaque exécution de la méthode fitBounds qui permet d’ajuster automatiquement le zoom de la carte afin que celle-ci affiche l’ensemble des markers de la map.

MAIS… comme très souvent remonté (ici et par exemple), l’exécution de la méthode fitBounds, incontournable si on souhaite afficher tous les markers disponibles sur la carte dans le viewport, va très logiquement déclencher les événements code>bounds_changed, zoom_changed, idle, puisqu’elle va faire « bouger » la carte lorsqu’elle va zoomer ou dézoomer. Si votre fonction fitBounds est exécutée au délenchement d’un des événements pré-cités, vous entrez dans une boucle infinie: l’exécution de fitBounds recommence encore er encore jusqu’à faire crasher le navigateur.

Solution: faire un mix de ce qui est suggéré ici: Do not fire ‘zoom_changed’ event when calling fitBounds function on map et ici: Fire javascript function 2 sec after no activity in input tag.

Créer un flag qui n’autorise pas les événements de la map à être exécutés si il est assigné (comme par défaut) à false.

Mettre en place un premier timer avec un seuil de 2 secondes qui se remettra à zéro et recommencera à chronométrer à chaque fois que l’event sera déclenché. Tant que ce timer n’aura pas atteint 2 secondes, il empêchera l’événement (bounds_changed dans notre exemple) de se déclencher réellement parce que le flag restera à false. Ce qu’on cherche ici, c’est d’éviter qu’en cas de boucle, le code assigné au déclenchement de l’événement ne soit exécuté encore et encore et encore…

[Google Maps] Astuces et bonnes pratiques

  • Tutoriaux Google map V3 en français: Créer un marker personnalisé, Insérer les coordonnées d’une adresse en BDD, Adresses au format JSON, Filtrer les markers par rapport à un périmètre, Récupérer le département ou le pays d’une adresse, Ajouter un type de carte – V3, Geocodage Inversé – V3, Géocoder une adresse – V3, Récupérer les limites de la carte – getBounds, Classe Map V3, Zoom automatique avec Fitbounds, classe MVCArray, classe MVCObject.
  • Des cluster makers custom: How to use CSS-only for cluster icons for Google Maps