12
votes

En essayant de lier plusieurs info-info-info-info-info-info-index sur plusieurs marqueurs sur une carte Google et l'échec

Mon projet utilise un flux JSON pour saisir des informations sur les tremblements de terre dans une limite de latitude et de longitude spécifiée, en faisant essentiellement une boîte. Je prends cette information et transformez tous les résultats en marqueurs sur une carte Google. J'ai besoin de chaque marqueur pour afficher également certaines informations supplémentaires. J'essaie donc d'utiliser les objets InfroWindow intégrés tels que lorsque vous cliquez sur un marqueur, vous ouvrez l'info-bulle avec des informations associées à ce marqueur. Cependant, je trouve que peu importe le marqueur I clic, le même InfoWowow revient toujours au-dessus du même marqueur de ce groupe, et je crois que c'est toujours la dernière info-info-info-info-annonce créée dans ma boucle. Voici le code.

$.getJSON(url, function(json) {
                    for(var i = 0; i < json.earthquakes.length; i++)
                    {
                        var pos = new google.maps.LatLng(json.earthquakes[i].lat, json.earthquakes[i].lng);
                        var info = json.earthquakes[i].lat + ", " + json.earthquakes[i].lng;
                        var marker = new google.maps.Marker({
                            map: map, 
                            position: pos,
                            title: json.earthquakes[i].eqid
                        })
                        var tooltip = new google.maps.InfoWindow({
                            content: info
                        })
                        google.maps.event.addListener(marker, 'click', function() {
                            tooltip.open(map, marker);
                        });
                        markers.push(marker);
                        tooltips.push(tooltip);
                    }               
                });


1 commentaires

Cela est dû à la fonctionnement des fermetures (le marqueur est adopté par référence à la fermeture, ce que vous voudriez est une copie). Mais lorsque l'auditeur est appelé, ce sera avec ce se référant à l'objet (marqueur) à laquelle l'écouteur a été ajouté. Vous pouvez donc simplement utiliser ce au lieu de marqueur .


3 Réponses :


20
votes

C'est une question très courante dans le tag Google-Maps et une erreur facile à faire :).

Que ce qui se passe est que votre événement de clic est appelé de manière asynchrone et qu'il ramasse la valeur actuelle de la variable de marqueur dans le rappel Getjson (le dernier de la liste).

Vous devez Enveloppez votre appel addlistener dans une fonction de sorte qu'une fermeture soit créée autour de la variable de marqueur utilisée dans le clic rappel: xxx

puis appelez Écossierer à partir de votre rappel Getjson ( où vous appelez actuellement addlistener).


2 commentaires

Merci pour cette solution simple et claire. En utilisant InfroWindow, vous pouvez simplement passer quelques paramètres de plus dans la fonction pour ajouter plus de contenu.


-1: Bien que cela fonctionne, il n'est pas nécessaire que ce se réfère à l'objet ajouté à l'auditeur.



2
votes

Placer l'appel de AddListener dans sa propre fonction résout également le problème de plusieurs info-info-info-infoWindows affichant tous le même texte.


0 commentaires

4
votes

Vous pouvez également faire ceci: xxx

où "marqueur" est remplacé par "Ceci" dans l'appel Ajout auditeur. Ainsi, vous pouvez placer le code addlisterner au même point que vous créez le marqueur et ne pas avoir à créer une nouvelle fonction.

http://you.arenot.me/2010/06/29/google-Appo-api-api-api- V3-0-Multipla-marqueurs-multiples-Infrowindows /

Vérifiez la solution complète et une démonstration: D


1 commentaires

Génial! Merci!