Как Opera любит пользователей и не любит веб-разработчиков
Несколько месяцев назад во время очередного «дня багов» в нашей команде мне попался баг на то, что в Опере в автокомплите к текстовым полям перестали работать клавиши «вверх» и «вниз». Причём баг проявляется только на боевой площадке, на локальных копиях сервиса всё было в порядке. Что ж, открываем свой не самый любимый браузер, запускаем ещё более не любимый Dragonfly и начинаем дебажиться… Небольшое лирическое отступление. Исторически сложилось так, что в нашем сервисе до сих пор используется jQuery Autocomplete v. 1.1 ещё с тех времён, когда автокомплит не был частью jQuery UI. Его использование — отдельная и достаточно больная тема, не имеющая прямого отношения к теме поста :) В первую очередь идём на «боевой» сервис и смотрим на место где происходит подписка на нужное событие. h.bind ((d.browser.opera? «keypress» : «keydown») + ».autocomplete», function© {…}); Ага, уже что-то, что теоретически может вызвать поломку. Стоит посмотреть, актуальна ли такая проверка для последних версий Оперы. Недолгое гугление приводит на страницу со спецификациями движка Presto, где в чейнджлоге к версии 2.10 нам радостно сообщают, что клавиши навигации больше не рейсят событие keypress. Объяснение почему навигация по списку не работает найдено довольно быстро. Но по-прежнему не ясно, почему всё замечательно на тестовой площадке. Дебажимся там и находим уже знакомое место подписки на keypress/keydown h.bind ((d.browser.opera && !('KeyboardEvent' in window) ? «keypress» : «keydown») + ».autocomplete», function© {…}); Стоп. Что это ещё за дополнительное условие? Проверка на KeyboardEvent позволяет нам задетектить Оперы версий младше 12, когда событие keypress для навигационных клавиш ещё работало. Только вот никто из разработчиков его туда не вставлял :) Протираю глаза и на всякий случай открываю jquery.autocomplete.js в Visual Studio. Всё в порядке, никаких »!('KeyboardEvent' in window)» нет и в помине. А если дать файлу любое другое произвольное имя, то и Опера перестанет вставлять в него свои костыли. Это же объясняет почему хак не работает на боевой площадке — при деплое скрипты комбайнятся в один минимизированный файл и браузер не может распознать автокомплит. Даже боюсь подумать, в какое количество скриптов они вставляют таким образом свои костыли :)