Come posso interrompere la propagazione degli eventi con il tasto destro del mouse sul marker Leaflet?


9

Non ho trovato un evento con il tasto destro del mouse sui marcatori Leaflet, quindi ho iniziato ad ascoltare l'evento mousedown. Nel metodo che risolve questo evento, controllo

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

Questo funziona nel modo in cui viene chiamato do_something (), ma l'evento si propaga alla mappa e viene mostrato un menu contestuale. Come posso impedire che l'evento si propaghi sulla mappa?

Funziona con tutti i principali browser (ie IE)?

Risposte:


4

Apparentemente la mia prima risposta non funzionava e poiché ora sto affrontando lo stesso problema. Ecco un nuovo approccio:

Il volantino supporta un evento chiamato contextmenu. Come si trova nella documentazione dell'evento Leaflet qui .

Attivato quando l'utente preme il pulsante destro del mouse sulla mappa, impedisce al menu di scelta rapida del browser di mostrare se ci sono listener su questo evento.

Quindi teoricamente il codice

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

dovrebbe funzionare bene. Ma a quanto pare l'implementazione è in ritardo rispetto alla documentazione. A partire da ora (Leaflet 0.4.5), a quanto contextmenupare, l' evento non è ancora supportato sui marker, sebbene funzioni perfettamente su oggetti polilinea.

Sembra esserci del lavoro in cantiere per abilitare questa funzione nel prossimo futuro (vedi discussioni qui e qui ). Quindi, suppongo che possiamo solo sperare che Leaflet lavori su questo rapidamente e abiliti l'evento nella prossima versione ...

Modifica: ignora ciò che ho detto sull'attesa dell'implementazione. Se scarichi l'ultimo ramo principale dello sviluppo e compili il volantino da solo, avrai pieno supporto per gli contextmenueventi sui marcatori. Buona codifica.


4

Prevenzione del comportamento predefinito in Internet Explorer e in tutti gli altri browser:

event.returnValue = false;
if (event.preventDefault) event.preventDefault();

Non sembra funzionare. Lo hai provato su Leaflet? Il tuo evento è un volantino o l'originale DOMMouseEvent attivato dal browser?
sig.

Questo è per un evento DOM. Se il volantino avvolge gli eventi, utilizzare event.originalEvent.
tmcw,

4

Prova questa funzione interna:

L.DomEvent.stopPropagation(event);

Dovrebbe fare il trucco.

PS Non l'ho mai trovato in nessun documento ma l'ho visto usato in una patch. Utilizzare a proprio rischio. ;)

Modifica: ho trovato anche questa funzione interna

L.DomEvent.preventDefault(event);

Che sembra essere molto simile a quello event.preventDefault()di jQuery.


Ho usato il tuo frammento, ma quello che succede è lo stesso della soluzione di tmcw. Faccio clic con il pulsante destro del mouse sul mio marker. Va al metodo di ascolto. Lì rimuove il marcatore (questo è ciò che il clic destro dovrebbe fare per me) e quindi si apre un menu di scelta rapida sulla mappa dove ho cliccato come se l'intera cosa del marcatore non accadesse.
sig.

Per caso l'ho appena trovato L.DomEvent.preventDefault(event);. Da quello che ho visto (guardando la fonte Leaflet.js) questo dovrebbe essere molto simile a quello preventDefault()fornito da jQuery ... Provalo! :)
Fgysin ripristina Monica il

L'ho provato, ma il menu contestuale standard che ottengo in FF quando faccio clic con il tasto destro su una pagina HTML continua a comparire.
sig.

2

Ho avuto una soluzione per inciso per interrompere l'evento.

Ad esempio, se un evento viene creato in questo modo map.on("click", onMapClick);, l'evento può essere arrestato con questo codice -map.off("click", onMapClick);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.