У меня есть поле ввода, которое вызывает настраиваемое раскрывающееся меню. Хотелось бы следующего функционала:
- Когда пользователь щелкает где-нибудь за пределами поля ввода, меню должно быть удалено.
- Если, более конкретно, пользователь щелкает div внутри меню, меню должно быть удалено, и должна происходить специальная обработка в зависимости от того, какой div был нажат.
Вот моя реализация:
Поле ввода имеет onblur()
событие, которое удаляет меню (путем установки его родительского элемента innerHTML
на пустую строку) всякий раз, когда пользователь щелкает мышью за пределами поля ввода. Дивы внутри меню также имеют onclick()
события, которые выполняют специальную обработку.
Проблема в том, что onclick()
события никогда не срабатывают при нажатии на меню, потому что поле ввода onblur()
срабатывает первым и удаляет меню, включая onclick()
s!
Я решил эту проблему путем разделения дивы меню onclick()
в onmousedown()
и onmouseup()
события и установив глобальный флаг вниз мыши , который очищается от мыши вверх, подобно тому , что было предложено в этом ответе . Поскольку onmousedown()
срабатывает раньше onblur()
, флаг будет установлен, onblur()
если был нажат один из разделов меню, но не если где-то еще на экране. Если меню было нажато, я немедленно выхожу из него, onblur()
не удаляя меню, затем жду, пока сработает кнопка, после onclick()
чего я могу безопасно удалить меню.
Есть ли более элегантное решение?
Код выглядит примерно так:
<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;
...
}