Saya hanya ingin berbagi sesuatu dengan Anda.
Saya mengalami kesulitan dengan ng-mouseenter
dan ng-mouseleave
acara.
Studi kasus:
Saya membuat menu navigasi mengambang yang beralih ketika kursor berada di atas ikon.
Menu ini ada di atas setiap halaman.
- Untuk menangani show / hide pada menu, saya beralih kelas.
ng-class="{down: vm.isHover}"
- Untuk beralih vm.isHover , saya menggunakan acara ng mouse.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Untuk saat ini, semuanya baik-baik saja dan berfungsi seperti yang diharapkan.
Solusinya bersih dan sederhana.
Masalah yang masuk:
Dalam tampilan tertentu, saya memiliki daftar elemen.
Saya menambahkan panel tindakan ketika kursor berada di atas elemen daftar.
Saya menggunakan kode yang sama seperti di atas untuk menangani perilaku.
Masalah:
Saya tahu ketika kursor saya ada di menu navigasi mengambang dan juga di atas elemen, ada konflik antara satu sama lain.
Panel aksi muncul dan navigasi mengambang disembunyikan.
Masalahnya adalah bahwa bahkan jika kursor berada di atas menu navigasi mengambang, elemen daftar ng-mouseenter dipicu.
Tidak masuk akal bagi saya, karena saya akan mengharapkan jeda otomatis dari acara propagasi mouse.
Saya harus mengatakan bahwa saya kecewa dan saya meluangkan waktu untuk mencari tahu masalah itu.
Pikiran pertama:
Saya mencoba menggunakan ini:
$event.stopPropagation()
$event.stopImmediatePropagation()
Saya menggabungkan banyak peristiwa pointer pointer (mousemove, mouveover, ...) tetapi tidak ada yang membantu saya.
Solusi CSS:
Saya menemukan solusinya dengan properti css sederhana yang saya gunakan semakin banyak:
pointer-events: none;
Pada dasarnya, saya menggunakannya seperti itu (pada elemen daftar saya):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
Dengan yang rumit ini, peristiwa ng-mouse tidak akan lagi dipicu dan menu navigasi mengambang saya tidak akan lagi menutup dirinya ketika kursor berada di atasnya dan lebih dari satu elemen dari daftar.
Untuk melangkah lebih jauh:
Seperti yang Anda harapkan, solusi ini berfungsi tetapi saya tidak menyukainya.
Kami tidak mengontrol acara kami dan itu buruk.
Plus, Anda harus memiliki akses ke vm.isHover
ruang lingkup untuk mencapai itu dan mungkin tidak mungkin atau tidak mungkin kotor dalam beberapa cara.
Saya bisa membuat biola jika seseorang ingin melihat.
Meskipun demikian, saya tidak punya solusi lain ...
Ceritanya panjang dan saya tidak bisa memberi Anda kentang, jadi tolong maafkan saya teman saya.
Bagaimanapun, pointer-events: none
ini adalah kehidupan, jadi ingatlah itu.