Como interrompo a propagação de eventos com o botão direito do mouse no marcador Leaflet?

9

Não encontrei um evento de clique direito nos marcadores do Leaflet, então comecei a ouvir o evento do mouse. No método que resolve esse evento, verifico

if (event.originalEvent.button == 2) {
    do_something();
    // now i want to stop propagation of the rightclick
    return;
}

Isso funciona porque do_something () é chamado, mas o evento se propaga para o mapa e um menu de contexto está sendo mostrado. Como evito que o evento seja propagado para o mapa?

Isso funciona em todos os principais navegadores (ie IE)?

mrg
fonte

Respostas:

4

Minha primeira resposta aparentemente não estava funcionando e agora estou enfrentando o mesmo problema. Aqui está uma nova abordagem:

Folheto suporta um evento chamado contextmenu. Conforme encontrado na documentação do evento do folheto aqui .

Disparado quando o usuário pressiona o botão direito do mouse no mapa, impede que o menu de contexto do navegador padrão seja exibido se houver ouvintes nesse evento.

Então, teoricamente, o código

marker.on('contextmenu', function(e) {
  this.openPopup();
});

deve funcionar muito bem. Mas, aparentemente, a implementação está atrasada na documentação. A partir de agora (Folheto 0.4.5) contextmenu, aparentemente, o evento ainda não é suportado em marcadores, embora funcione perfeitamente em objetos de polilinha.

Parece haver trabalho em andamento para ativar esse recurso em um futuro próximo (consulte as discussões aqui e aqui ). Então, acho que podemos esperar que o Leaflet trabalhe nisso rapidamente e possibilite o evento no próximo lançamento ...

Edit: desconsidere o que eu disse sobre esperar pela implementação. Se você baixar o ramo principal de desenvolvimento mais recente e criar o folheto, você terá suporte total para contextmenueventos nos marcadores. Feliz codificação.

fgysin restabelecer Monica
fonte
4

Impedindo o comportamento padrão no IE e em todos os outros navegadores:

event.returnValue = false;
if (event.preventDefault) event.preventDefault();
tmcw
fonte
Não parece funcionar. Você já testou isso no Leaflet? E o seu evento é um evento de folheto ou o DOMMouseEvent original disparado pelo navegador?
Mrg
Isto é para um evento DOM. Se o Leaflet agrupar eventos, use event.originalEvent.
tmcw
4

Tente esta função interna:

L.DomEvent.stopPropagation(event);

Deveria fazer o truque.

PS: Nunca encontrei isso em nenhuma documentação, mas o vi usado em um patch. Use por sua conta e risco. ;)

Edit: Eu também encontrei esta função interna

L.DomEvent.preventDefault(event);

O que parece ser o mesmo event.preventDefault()que o jQuery.

fgysin restabelecer Monica
fonte
Usei seu snippet, mas o que acontece é o mesmo da solução tmcw. Clico com o botão direito do mouse no meu marcador. Vai para o método de escuta. Lá, ele remove o marcador (é o que o botão direito do mouse deve fazer por mim) e, em seguida, um menu de contexto é aberto no mapa onde eu cliquei como se a coisa toda do marcador não tivesse acontecido.
mrg
Por acaso eu acabei de encontrar isso L.DomEvent.preventDefault(event);. Pelo que vi (olhando a fonte do Leaflet.js), isso deve ser muito semelhante ao preventDefault()fornecido pelo jQuery ... Experimente! :)
fgysin restabelece Monica
Eu tentei, mas o menu de contexto padrão que recebo no FF quando clico com o botão direito do mouse em uma página html continua aparecendo.
mrg
2

Aliás, tenho uma solução para interromper o evento.

Por exemplo, se um evento for criado assim - map.on("click", onMapClick);, o evento poderá ser parado com este código -map.off("click", onMapClick);

Alper Necati Akın
fonte