Mostrando pop-up ao passar o mouse, não ao clicar usando o Leaflet?

37

É possível no Leaflet que o pop-up seja aberto ao passar o mouse, não no clique?

Isso funciona para apenas um marcador de cada vez, mas eu preciso dele para um número maior de marcadores:

marker.on('mouseover', function(e){
    marker.openPopup();
});
contrafluxo
fonte
1
Se você tiver duas perguntas, abra dois tópicos para que possam ser respondidos separadamente.
Subterrâneo

Respostas:

43

Se você precisar mostrar o pop-up de um marcador, poderá usar o método bindPopup dos marcadores.

Então você tem mais controle e ele será automaticamente vinculado ao seu marcador.

No exemplo abaixo, você pode mostrar o pop-up quando o usuário passar o mouse e ocultá-lo quando o usuário sair do mouse:

        marker.bindPopup("Popup content");
        marker.on('mouseover', function (e) {
            this.openPopup();
        });
        marker.on('mouseout', function (e) {
            this.closePopup();
        });

Nota: Você pode ter problemas com o fechamento de pop-ups ao passar o mouse sobre o próprio pop-up, portanto, pode ser necessário ajustar a âncora do pop-up (consulte as configurações de pop-up) para mostrar seus pop-ups um pouco mais afastados do próprio marcador, para que não ocorra. desaparecer com muita facilidade.

Tomislav Muic
fonte
4
Solução para manter o pop-up visível quando pairando sobre ele - jsfiddle.net/sowelie/3JbNY
rob-gordon
9

Isso ajuda a mostrar pop-up ao passar o mouse sobre o marcador

marker.on('mouseover', function(e) {
  //open popup;
  var popup = L.popup()
   .setLatLng(e.latlng) 
   .setContent('Popup')
   .openOn(map);
});
Sujeesh Balan
fonte
1
obrigado! esse código me ajudou em algo não relacionado a essa pergunta.
Abbafei 6/01/19
6

Este não é um problema específico do folheto, mas uma questão de Javascript.

Armazene seus marcadores em uma coleção e vincule-os openPopupa um 'mouseover'evento para todos eles.

Por exemplo, com uma matriz:

var markers = getAllMarkers(); // up to you to implement, say it returns an Array<L.Marker>

for (var i = 0; i < markers.length; i++) {
    var currentMarker = markers[i];
    currentMarker.on('mouseover', currentMarker.openPopup.bind(currentMarker));
}
MattiSG
fonte
Opinião em um comentário e não na resposta: acho que a usabilidade de pop-ups abertos em um mapa, onde, por definição, seu cursor vagueia muito, é questionável. Deseja realmente que seus usuários encontrem caminhos entre os marcadores para finalmente alcançarem o que desejam, mas sempre ficam escondidos atrás de pop-ups sempre que tentam mover o cursor em direção ao alvo?
MattiSG
Infelizmente, essa não é minha escolha. Eu tenho marcadores armazenados como o novo L.MarkerClusterGroup com o Leaflet MarkerCluster: var markers = new L.MarkerClusterGroup (); essa codificação que você escreveu também funcionaria?
againstflow
@againstflow Erm, então você deve mudar sua pergunta. Você não está apenas pedindo para abrir marcadores em foco, mas sim como iterar sobre marcadores em uma L.MarkerClusterinstância ... Minha resposta mostra claramente como vincular uma coleção de pop-ups em foco. Se você deseja saber como obter uma coleção de um cluster, isso é outra coisa.
precisa saber é o seguinte
6

Se você estiver usando o Leaflet 1.3.x, a ligação de dicas de ferramentas é um método interno.

http://leafletjs.com/reference-1.3.0.html#tooltip

var polyline = L.polyline([[StartLat, StartLong],[EndLat,EndLong]]).addTo(this.map);
    polyline.bindTooltip("tool tip is bound");
Desenvolvedor totalmente preso
fonte
1
Fantástico. Evita totalmente o jitter "mouseover" / "mouseout" descrito acima.
Nick K9
bindTooltip()também funciona em marcadores individuais.
S. Baggy 12/09
4

Em termos de ter uma solução que funcione "para um número maior de marcadores", é isso que faço para cada camada de dados de pontos carregados do GeoJSON:

var layerPopup;
featureLayer.on('mouseover', function(e){
    var coordinates = e.layer.feature.geometry.coordinates;
    var swapped_coordinates = [coordinates[1], coordinates[0]];  //Swap Lat and Lng
    if (map) {
       layerPopup = L.popup()
           .setLatLng(swapped_coordinates)
           .setContent('Popup for feature #'+e.layer.feature.properties.id)
            .openOn(map);
    }
});
featureLayer.on('mouseout', function (e) {
    if (layerPopup && map) {
        map.closePopup(layerPopup);
        layerPopup = null;
    }
});
JayCrossler
fonte
Apenas curioso, que tipo de objeto é featureLayer? Parece que esta é uma ótima solução.
25915 Behr