Ну, у меня была та же проблема с моим выпадающим списком. Я спросил разработчиков Chrome относительно этой проблемы, они сказали, что это ошибка , которая не будет исправлена в ближайшем будущем из-за того, что «о ней не сообщали многие люди, и это исправление не тривиально» , Итак, давайте посмотрим правде в глаза: эта ошибка останется еще как минимум на год.
Хотя для этого конкретного случая (выпадающего списка) есть обходной путь. Хитрость в том, что при одном щелчке на полосе прокрутки событие «мыши вниз» приходит к элементу владельца этой полосы прокрутки. Мы можем использовать этот факт, чтобы установить флаг и проверить его в обработчике «onblur». Вот объяснение:
<input id="search_ctrl">
<div id="dropdown_wrap" style="overflow:auto;max-height:30px">
<div id="dropdown_rows">
<span>row 1</span>
<span>row 2</span>
<span>row 2</span>
</div>
</div>
div "dropdown_wrap" получит вертикальную полосу прокрутки, поскольку ее содержимое не соответствует фиксированной высоте. Как только мы получим щелчок, мы почти уверены, что полоса прокрутки была нажата, и фокус будет снят. Теперь немного кода, как с этим справиться:
search_ctrl.onfocus = function() {
search_has_focus = true
}
search_ctrl.onblur = function() {
search_has_focus = false
if (!keep_focus) {
// hide dropdown
} else {
keep_focus = false;
search_ctrl.focus();
}
}
dropdow_wrap.onclick = function() {
if (isChrome()) {
keep_focus = search_has_focus;
}
}
Вот и все. Нам не нужны хаки для FF, поэтому есть проверка для браузера. В Chrome мы обнаруживаем щелчок на полосе прокрутки, разрешаем размытие фокуса, не закрывая список, а затем немедленно возвращаем фокус обратно к элементу управления вводом. Конечно, если у нас есть некоторая логика для «search_ctrl.onfocus», она также должна быть изменена. Обратите внимание, что нам нужно проверить, был ли у search_ctrl фокус, чтобы избежать двойных щелчков.
Вы можете догадаться, что лучшей идеей может быть отмена события onblur, но это не сработает в Chrome. Не уверен, что это ошибка или особенность.
P.S. «dropdown_wrap» не должен иметь никаких отступов или границ, в противном случае пользователь может щелкнуть эти области, и мы будем рассматривать это как нажатие полосы прокрутки.