Saya mengalami masalah dengan onmouseout
fungsi dalam div posisi absolut. Ketika mouse menyentuh elemen anak di div, acara mouseout menyala, tapi saya tidak ingin itu menyala sampai mouse keluar dari induknya, absolut div.
Bagaimana saya bisa mencegah mouseout
acara dari menembak ketika menyentuh elemen anak TANPA jquery.
Saya tahu ini ada hubungannya dengan peristiwa yang menggelegak, tetapi saya tidak beruntung menemukan cara mengatasi ini.
Saya menemukan posting serupa di sini: Bagaimana cara menonaktifkan peristiwa mouseout yang dipicu oleh elemen anak?
Namun solusi itu menggunakan jQuery.
Jawaban:
Saya membuat demo JsFiddle cepat, dengan semua CSS dan HTML yang dibutuhkan, lihat ...
Tautan EDIT TETAP untuk dukungan lintas-browser http://jsfiddle.net/RH3tA/9/
Perhatikan bahwa ini hanya memeriksa orang tua langsung, jika div orang tua memiliki anak-anak bersarang maka Anda harus entah bagaimana melintasi elemen orang tua mencari "elemen asli"
Contoh EDIT untuk anak-anak yang bersarang
EDIT Fixed untuk semoga cross-browser
Dan JSFiddle baru , tautan yang diperbarui EDIT
sumber
mouseleave
adalah jawaban yang benarGunakan
onmouseleave
.Atau, di jQuery, gunakan
mouseleave()
Ini adalah hal yang tepat yang Anda cari. Contoh:
atau, di jQuery:
contohnya ada di sini .
sumber
onMouseLeave
adalah apa yang akhirnya saya gunakan juga karena tidak muncul.mouseleave
tidak bisa dibatalkanUntuk solusi CSS murni sederhana yang berfungsi dalam beberapa kasus ( IE11 atau yang lebih baru ), orang dapat menghapus anak-anak
pointer-events
dengan mengaturnyanone
sumber
pointer-events
propertiInilah solusi yang lebih elegan berdasarkan apa yang ada di bawah ini. itu menyumbang peristiwa menggelegak dari lebih dari satu tingkat anak-anak. Ini juga menyumbang masalah lintas-browser.
sumber
this
dari garis definisi fungsi @GregoryLewis disebutkan memperbaiki masalah. Juga untuk dukungan lintas browser lainnya, coba ini: if (window.addEventListener) {document.getElementById ('parent'). AddEventListener ('mouseout', onMouseOut, true); } lain jika (window.attachEvent) {document.getElementById ('parent'). attachEvent ("onmouseout", onMouseOut); }Terima kasih kepada Amjad Masad yang menginspirasi saya.
Saya sudah solusi berikut yang tampaknya berfungsi di IE9, FF dan Chrome dan kodenya cukup singkat (tanpa penutupan kompleks dan melintangkan hal-hal anak):
sumber
bukannya onmouseout menggunakan onmouseleave.
Anda belum menunjukkan kepada kami kode spesifik Anda sehingga saya tidak dapat menunjukkan kepada Anda pada contoh spesifik Anda bagaimana melakukannya.
Tapi itu sangat sederhana: ganti onmouseout dengan onmouseleave.
Itu saja :) Jadi, sederhana :)
Jika tidak yakin bagaimana melakukannya, lihat penjelasan tentang:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out
Ketenangan kue :) Nikmati saja :)
sumber
Jika Anda menggunakan jQuery, Anda juga dapat menggunakan fungsi "mouseleave", yang menangani semua ini untuk Anda.
do_something akan menyala ketika mouse memasuki targetdiv atau salah satu dari anak-anaknya, do_something_else hanya akan menyala ketika mouse meninggalkan targetdiv dan salah satu dari anak-anaknya.
sumber
Saya pikir Quirksmode memiliki semua jawaban yang Anda butuhkan (perilaku browser yang berbeda dan aktivitas mouseenter / mouseleave ), tapi saya pikir kesimpulan paling umum untuk kekacauan acara itu adalah penggunaan kerangka kerja seperti JQuery atau Mootools (yang memiliki mouseenter dan acara mouseleave , yang persis seperti apa yang Anda intuisi akan terjadi).
Lihatlah bagaimana mereka melakukannya, jika Anda mau, lakukan sendiri
atau Anda dapat membuat versi Mootools "lean mean" khusus Anda hanya dengan bagian acara (dan ketergantungannya).
sumber
Mencoba
mouseleave()
Contoh:
;)
sumber
Saya telah menemukan solusi yang sangat sederhana,
cukup gunakan event onmouseleave = "myfunc ()" daripada event onmousout = "myfunc ()"
Dalam kode saya itu berhasil !!
Contoh:
Contoh yang sama dengan fungsi mouseout:
Semoga bermanfaat :)
sumber
Meskipun solusi yang Anda maksud menggunakan jquery, mouseenter dan mouseleave adalah acara dom asli, jadi Anda dapat menggunakannya tanpa jquery.
sumber
Ada dua cara untuk menangani ini.
1) Periksa event.target hasil dalam panggilan balik Anda untuk melihat apakah itu cocok dengan div orangtua Anda
2) Atau gunakan menangkap acara dan memanggil event.stopPropagation dalam fungsi callback
sumber
Saya membuatnya bekerja seperti pesona dengan ini:
Ah, dan
MyDiv
tag seperti ini:Dengan cara ini, ketika onmouseout pergi ke anak, cucu, dll ... itu
style.display='none'
itu tidak dieksekusi; tetapi ketika onmouseout keluar dari MyDiv itu berjalan.Jadi tidak perlu menghentikan propagasi, gunakan timer, dll ...
Terima kasih atas contohnya, saya dapat membuat kode ini dari mereka.
Semoga ini bisa membantu seseorang.
Juga dapat ditingkatkan seperti ini:
Dan kemudian tag DIVs seperti ini:
Jadi lebih umum, tidak hanya untuk satu div dan tidak perlu menambahkan
id="..."
pada setiap layer.sumber
Jika Anda memiliki akses ke elemen yang dilampirkan acara di dalam
mouseout
metode, Anda dapat menggunakancontains()
untuk melihat apakahevent.relatedTarget
elemen anak atau tidak.Seperti
event.relatedTarget
elemen yang dilewati mouse, jika bukan elemen anak, Anda telah keluar dari elemen tersebut.sumber
Pada Sudut 5, 6 dan 7
Lalu selanjutnya
sumber
Saya memeriksa offset elemen asli untuk mendapatkan koordinat halaman batas elemen, lalu pastikan tindakan mouseout hanya dipicu saat mouseout keluar dari batas tersebut. Kotor tapi berhasil.
sumber
sumber
Jika Anda menambahkan (atau memiliki) kelas CSS atau id ke elemen induk, maka Anda dapat melakukan sesuatu seperti ini:
Jadi hal-hal hanya akan dieksekusi ketika acara tersebut pada div induk.
sumber
Saya hanya ingin berbagi sesuatu dengan Anda.
Saya mengalami kesulitan dengan
ng-mouseenter
danng-mouseleave
acara.Studi kasus:
Saya membuat menu navigasi mengambang yang beralih ketika kursor berada di atas ikon.
Menu ini ada di atas setiap halaman.
ng-class="{down: vm.isHover}"
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:
Pada dasarnya, saya menggunakannya seperti itu (pada elemen daftar saya):
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.sumber