Özel bir açılır menüyü getiren bir giriş alanım var. Aşağıdaki işlevselliği istiyorum:
- Kullanıcı, giriş alanının dışında herhangi bir yere tıkladığında, menü kaldırılmalıdır.
- Daha spesifik olarak, kullanıcı menü içindeki bir div öğesini tıklarsa, menü kaldırılmalı ve hangi div öğesinin tıklandığına bağlı olarak özel işlemler gerçekleştirilmelidir.
İşte benim uygulamam:
Giriş alanında, kullanıcı giriş alanının dışına her tıkladığında onblur()
menüyü silen (üst öğelerini innerHTML
boş bir dizeye ayarlayarak) bir olay vardır . Menü içindeki div'ler ayrıca onclick()
özel işlemeyi yürüten olaylara da sahiptir .
Sorun şu ki, onclick()
menü tıklandığında olayların asla tetiklenmemesi, çünkü onblur()
ilk önce giriş alanı tetikleniyor ve onclick()
s!
Sorunu, menü onclick()
bölmelerini onmousedown()
ve onmouseup()
olaylarını bölerek ve bu yanıtta önerildiği gibi, fare aşağıdayken farenin yukarısında temizlenen global bir bayrak belirleyerek çözdüm . Daha onmousedown()
önce patladığı için, menü div'lerinden biri tıklandığında onblur()
bayrak ayarlanacaktır onblur()
, ancak ekranda başka bir yer varsa değil. Menü tıklandıysa menüyü onblur()
silmeden hemen geri dönüyorum, ardından onclick()
ateşlenmesini bekliyorum, bu noktada menüyü güvenle silebilirim.
Daha zarif bir çözüm var mı?
Kod şuna benzer:
<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;
...
}