Saya memiliki kolom input yang menampilkan menu drop-down kustom. Saya ingin fungsi berikut:
- Saat pengguna mengklik di mana saja di luar bidang input, menu harus dihapus.
- Jika, lebih khusus lagi, pengguna mengklik div di dalam menu, menu tersebut harus dihapus, dan pemrosesan khusus akan terjadi berdasarkan div mana yang diklik.
Inilah implementasi saya:
Bidang masukan memiliki onblur()
peristiwa yang menghapus menu (dengan menyetel induknya innerHTML
ke string kosong) setiap kali pengguna mengklik di luar bidang masukan. Div di dalam menu juga memiliki onclick()
event yang menjalankan pemrosesan khusus.
Masalahnya adalah bahwa onclick()
kejadian tidak pernah menyala saat menu diklik, karena bidang masukan onblur()
diaktifkan terlebih dahulu dan menghapus menu, termasukonclick()
s!
Saya memecahkan masalah dengan membagi menu divs ' onclick()
menjadi onmousedown()
dan onmouseup()
event dan mengatur bendera global pada mouse ke bawah yang dihapus pada mouse ke atas, mirip dengan yang disarankan dalam jawaban ini . Karena onmousedown()
diaktifkan sebelumnya onblur()
, flag akan disetel onblur()
jika salah satu div menu diklik, tetapi tidak jika di tempat lain di layar ada. Jika menu itu diklik, saya langsung kembali dari onblur()
tanpa menghapus menu, lalu menunggu onclick()
hingga menyala, pada titik mana saya dapat menghapus menu dengan aman.
Apakah ada solusi yang lebih elegan?
Kode tersebut terlihat seperti ini:
<div class="menu" onmousedown="setFlag()" onmouseup="doProcessing()">...</div>
<input id="input" onblur="removeMenu()" ... />
var mouseflag;
function setFlag() {
mouseflag = true;
}
function removeMenu() {
if (!mouseflag) {
document.getElementById('menu').innerHTML = '';
}
}
function doProcessing(id, name) {
mouseflag = false;
...
}