Bagaimana cara menghentikan propagasi acara dengan klik kanan pada penanda Leaflet?

9

Saya tidak menemukan acara klik kanan di spanduk Leaflet jadi saya mulai mendengarkan acara mousedown. Dalam metode yang menyelesaikan acara ini saya periksa

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

Ini berfungsi di do_something () dipanggil, tetapi acara menyebar ke peta dan menu konteks sedang ditampilkan. Bagaimana saya mencegah acara untuk menyebar ke peta?

Apakah ini berfungsi di semua browser utama (yaitu IE)?

mrg
sumber

Jawaban:

4

Jawaban pertama saya tampaknya tidak berfungsi dan karena saya sekarang menghadapi masalah yang sama. Ini pendekatan baru:

Leaflet mendukung acara yang disebut contextmenu. Seperti yang ditemukan dalam dokumentasi acara Leaflet di sini .

Dipecat ketika pengguna menekan tombol mouse sebelah kanan pada peta, mencegah menu konteks browser default dari menunjukkan jika ada pendengar pada acara ini.

Jadi secara teoritis kodenya

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

harus bekerja dengan baik. Namun ternyata implementasinya tertinggal dari dokumentasi. Sampai sekarang (Leaflet 0.4.5) yang contextmenuacara ini tampaknya tidak belum didukung pada spidol, meskipun bekerja baik-baik saja pada objek polyline.

Tampaknya akan ada pekerjaan dalam pipa untuk mengaktifkan fitur ini dalam waktu dekat (lihat diskusi di sini dan di sini ). Jadi, saya kira kita hanya bisa berharap bahwa Leaflet mengerjakan ini dengan cepat dan memungkinkan acara di rilis berikutnya ...

Sunting: Mengabaikan apa yang saya katakan tentang menunggu implementasi. Jika Anda mengunduh cabang utama pengembangan terbaru dan membuat leaflet sendiri, Anda mendapatkan dukungan penuh untuk contextmenuacara yang menggunakan marker. Selamat coding.

fgysin mengembalikan Monica
sumber
4

Mencegah perilaku default di IE dan semua browser lain:

event.returnValue = false;
if (event.preventDefault) event.preventDefault();
tmcw
sumber
Sepertinya tidak berhasil. Sudahkah Anda menguji ini di Leaflet? Dan apakah acara Anda merupakan selebaran atau DOMMouseEvent asli yang dipecat oleh browser?
mrg
Ini untuk acara DOM. Jika Leaflet membungkus acara, gunakan event.originalEvent.
tmcw
4

Coba fungsi internal ini:

L.DomEvent.stopPropagation(event);

Seharusnya melakukan trik.

PS Saya tidak pernah menemukan itu dalam dokumentasi apa pun tetapi melihatnya digunakan dalam tambalan. Gunakan dengan risiko Anda sendiri. ;)

Sunting: Saya juga menemukan fungsi internal ini

L.DomEvent.preventDefault(event);

Yang tampaknya sangat sama dengan event.preventDefault()yang ada di jQuery.

fgysin mengembalikan Monica
sumber
Saya menggunakan cuplikan Anda, tetapi yang terjadi sama dengan solusi tmcw. Saya klik kanan penanda saya. Itu pergi ke metode mendengarkan. Di sana menghapus penanda (itulah yang harus dilakukan klik kanan untuk saya) dan kemudian menu konteks terbuka pada peta di mana saya mengklik seolah-olah seluruh hal penanda tidak terjadi.
mrg
Secara kebetulan saya baru saja menemukan ini L.DomEvent.preventDefault(event);. Dari apa yang saya lihat (melihat sumber Leaflet.js) ini harus sangat mirip dengan yang preventDefault()disediakan oleh jQuery ... Cobalah! :)
fgysin mengembalikan Monica
Saya mencobanya, tetapi menu konteks standar yang saya dapatkan di FF ketika saya klik kanan pada halaman html terus muncul.
mrg
2

Saya mendapat solusi kebetulan untuk menghentikan acara.

Misalnya, jika acara dibuat seperti ini - map.on("click", onMapClick);, acara dapat dihentikan dengan kode ini -map.off("click", onMapClick);

Alper Necati Akın
sumber