25 окт. 2011 г.

Фокусы с фокусом в Opera

Случайно наткнулся на неприятную проблему в Opera, которая существовала ещё в версии 9.64 (а может и в более ранних, просто это самая старая версия, которая у меня имелась), и существует до сих пор (в версии 11.51 - последней имеющейся у меня на момент написания статьи).
Исходный замысел был в полном раскрытии опций тега select при попадании на него фокуса с помощью изменения атрибута size и возврате в исходное состояние при потере фокуса (<select onfocus="this.size=this.options.length" onblur="this.size=1">). Опере такие манипуляции решительно не понравились.

Собственно демонстрация проблемы - попробуйте переключаться между полями кнопкой Tab и выбирать значения select стрелками вверх/вниз.

Во всех проверенных браузерах (IE 8, Firefox 3.6-7, Chrome 14 и т.д.) навигация и выбор значений проходят нормально, и только в Opera пачками валятся косяки:
  1. При попадании на подопытный select он раскрывается, как и задумано, но пунктирный outline со списка опций пропадает, и выбрать опцию с клавиатуры стрелками вверх/вниз становится невозможно.
  2. При нажатии Tab фокус уходит на следующее поле, но обработчик onblur не срабатывает (никакого события blur).
  3. Если сейчас нажать Shift-Tab, мы вернёмся на select, но теперь он уже реагирует на выбор опций с клавиатуры, и корректно теряет фокус (событие blur происходит, обработчик onblur вызывается и сворачивает select).
  4. Аналогично происходит получение/потеря фокуса при работе мышкой: при первом клике select получает фокус и разворачивается, но управляться с клавиатуры и признавать потерю фокуса не желает, зато при повторном клике слушается как положено. Потом круг замыкается, и всё начинается сначала: первый клик - глючный, второй - нормальный.
Манипуляции с отложенным изменением size и разными вариантами назначения обработчиков событий никакого успеха не принесли: в Opera глюки, в остальных браузерах работает прекрасно.

Комментариев нет:

Отправить комментарий