Wie identifiziere ich den Leaflet-Marker während eines `popupopen`-Ereignisses?
Lesezeit: 3 Minuten
Wenn auf eine Markierung geklickt wird, muss ich einen Code ausführen, der die findet id entsprechend der angeklickten Markierung , ruft Daten von der Backend-API ab und fügt dann die neu abgerufenen Daten zu hinzu content des sich öffnenden Popups.
Die einzige Möglichkeit, ein Klickereignis auf dem Marker zu hören, ist
map.on('popupopen', function(e){
// How to retrieve marker?
// eg: Assign an id on creation, retrieve it now during popupopen
};)
Wie kann ich herausfinden, welcher Marker das ist? Ist es möglich, eine hinzuzufügen id Attribut zu jeder Markierung, dann rufen Sie diese ab id während der popupopen Veranstaltung?
leaflet.cloudmade.com/reference.html#marker EIN L.Marker wird auf der Karte platziert: marker.addTo(map). Ich kann eine bestehen id Wert für jeden Einzelnen marker Objekt. Wie soll das gehen und wie kann ich das abrufen id später während a popupopen Veranstaltung?
– Nyxynyx
3. Oktober 2012 um 3:36 Uhr
Beim Erstellen von Markierungen mache ich so etwas wie var marker = new L.marker( new L.LatLng( lat, lng )); Dann marker.setContent(content).addTo(map).
– Nyxynyx
3. Oktober 2012 um 4:14 Uhr
Das Ereignisobjekt enthält ein “Popup”-Attribut, das ein privates Attribut namens “_source” hat, das das Objekt ist, an das das Popup gebunden ist (dh die Markierung). Da _source privat sein soll, scheint dies nicht der richtige Weg zu sein, aber ich bin mir nicht sicher, wie ich es sonst machen soll.
map.on('popupopen', function(e) {
var marker = e.popup._source;
});
Ich erhalte undefined an e.popup._source beim Öffnen eines Popups, das von a generiert wurde L.geoJson() Anruf. Irgendwelche Hinweise?
– Nachto
15. Juli 2015 um 2:41 Uhr
Mein schmutzig Lösung im Moment war, a einzuschließen <div> innerhalb des Popup-Inhalts auf onEachFeature und dann nachschauen… e.target._popup._contentNode.childNodes[0].attributes[0]. Ja, schmutzig, aber es funktioniert. Puh
– Nachto
15. Juli 2015 um 2:51 Uhr
Javascript-Objekte können beliebige Eigenschaften haben, die für sie definiert sind. Legen Sie popup.marker auf die referenzierte Markierung fest, wenn Sie das Popup erstellen. Dann können Sie später im Ereignishandler darauf zugreifen.
Ausgezeichnete Idee, denn in meinem Fall e.popup._source war null
– Leo
28. März 2016 um 8:27 Uhr
Diese Antwort ist wohl besser als die akzeptierte, da die e.popup._source kann tatsächlich fehlen, zum Beispiel wenn das Popup programmgesteuert geöffnet/geschlossen wurde (anstatt zu klicken).
– Robert
12. März 2020 um 14:50 Uhr
Um die Marker-ID zu erhalten, können Sie diesen Code verwenden:
map.on('popupopen', function(e) {
var marker = e.popup._source.feature.properties.markerid;
});
Andere Antworten haben nicht funktioniert, aber das funktioniert:
Ich schätze, diese Bibliothek ist ziemlich volatil … und ich bin mir nicht sicher, warum es überhaupt so kompliziert ist, solche Informationen zu übertragen.
Ich wollte eine Option finden, die keine privaten Dinge verwendet – diese Methode legt Eigenschaften für das Popup fest, auf die zugegriffen werden kann popupopen und popupclose Veranstaltungen:
Sie können für jedes von Ihnen erstellte Popup einen anderen Listener erstellen:
yourMarker1.bindPopup(popupContent1).on("popupopen", function(event){
//this will be fired only for this specific popup of marker1 .
});
yourMarker2.bindPopup(popupContent2).on("popupopen", function(event){
//this will be fired only for this specific popup of marker2.
});
10576800cookie-checkWie identifiziere ich den Leaflet-Marker während eines `popupopen`-Ereignisses?yes
leaflet.cloudmade.com/reference.html#marker EIN
L.Marker
wird auf der Karte platziert:marker.addTo(map)
. Ich kann eine bestehenid
Wert für jeden Einzelnenmarker
Objekt. Wie soll das gehen und wie kann ich das abrufenid
später während apopupopen
Veranstaltung?– Nyxynyx
3. Oktober 2012 um 3:36 Uhr
Beim Erstellen von Markierungen mache ich so etwas wie
var marker = new L.marker( new L.LatLng( lat, lng ));
Dannmarker.setContent(content).addTo(map)
.– Nyxynyx
3. Oktober 2012 um 4:14 Uhr