Pull to refresh

Не кроссбраузерный event

Reading time 3 min
Views 3.3K
Здравстуйте, уважаемое хабрасообщество. Реквестирую консультацию.
Позавчера, во время разработки jQuery.keyboard столкнулся с абсолютной браузерной несовместимостью, ужасно неприятной непоследовательностью и т.д. в возврашении значения event.keyCode в различных браузерах. На удивление, единственный, кто меня порадовал — IE 6 (ies4linux) и больше всех огорчила — опера 10. Хромиум и фокс же ж вернули приблизительно одинаковый результат.


Итак, сперва — код теста:

<!DOCTYPE html>
<
html>
    <
head>
        <
meta http-equiv='content-type' content='text/html; charset=utf-8' />
        <
title>Javascript Event Test</title>
    </
head>
    <
body></body>
    <
script type='text/javascript'>
var keys = {};
var 
body document.getElementsByTagName("body")[0];

var 
dumpObj = function (obj) {
    var 
dump "";
    for (var 
i in obj) {
        
dump += ":" obj[i] + "; ";
    }
    return 
dump;
}

document.onkeydown = function (e) {
    
|| event;
    
keys[e.keyCode] = 1;
    
body.innerHTML += dumpObj(keys) + "<br />";
}

document.onkeyup = function (e) {
    
|| event;
    
keys[e.keyCode] = 0;
}
    </script>
</html>


и теперь — результаты (пишу клавишесочетание и вернувшиеся коды):

Во всех браузерах

shift — 16 ctrl — 17 alt — 18

IE и то, как я ожидал (порядок неважен)

shift + ctrl — 16+17
shift + alt  — 16+18
ctrl  + alt  — 17+18

Firefox 3.5

shift + ctrl  — 16+0
ctrl  + shift — 17+0
shift + alt   — 16+224
alt   + shift — 18+16
ctrl  + alt   — 17+18
alt   + ctrl  — 18+17

Chromium 4

shift + ctrl  — 16+0
ctrl  + shift — 17+0
shift + alt   — 16+91
alt   + shift — 18+16
ctrl  + alt   — 17+18
alt   + ctrl  — 18+17

Opera 10

shift + ctrl  — 16 (при нажатии на Ctrl событие не срабатывает)
ctrl  + shift — 17 (при нажатии на Shift событие не срабатывает)
shift + alt   — 16+0
alt   + shift — 18 (при нажатии на Shift событие не срабатывает)
ctrl  + alt   — 17+18
alt   + ctrl  — 18 (при нажатии на Ctrl событие не срабатывает)


Подозреваю, что в Маке с кнопкой Meta дела обстоят подобным образом.
Теперь — вопросы:
1. Зачем этот беспредел был устроен в «правильных» браузерах? Никакой последовательности. Даже Гекко и ВебКит, выдающие приблизительно одинаковые результаты — не смогли определится с кодом shift+alt
2. Что за пиз странный подход у Оперы? Допустим, проблемы Фокса и Хрома можно решить, отслеживая свойства event.shiftKey и подобные, или занеся таблицу соответствий. Например, что 224 на самом деле не что иное, как 18
3. Самое простое решение — это было бы поступить так, как в плагине «Handling Keyboard Shortcuts». Данный подход мгновенно решил бы множество проблем, но в нём можно делать комбинации только с помощью Ctrl/Alt/Shift + одна клавиша. Комбинации ал-ля Space+X или C+V+B там не пройдут, что меня совсем не радует.
4. Где бы узнать какие еще есть несоответствия у этих браузеров. Как, кстати, поступают ИЕ7 и ИЕ8, ато я сижу на Линуксе и проверить не могу.
5. Кто-то может что-то добавить от себя?

Плюс еще один ньюанс. В прошлом топике anatoly-rr заметил интересный баг моей библиотеки. Суть бага в том, что когда зажимается клавиша на объекте происходит событие keydown, если же снять фокус с объекта и отжать клавишу — события keyup не происходит, потому клавиша всё еще считается зажатой. На данный момент я думаю решить это так — повесить, чтобы при onblur стирались все зажатые клавиши, но может есть более изящное решение?

По мере возникновения вопросов (и появления решений) по евенту я думаю дополнять этот топик и сообщать об этом в комментах

Не кроссплатформенно?


Тут мне сообщаются, что в Windows подобных проблем ни в одном браузере нет? Неужели это проблема только в браузерах под Линукс, продолжение истории с русской раскладкой в фоксе? Если так, то, пожалуй, придётся писать три баг-репорта. Но идея, что моё приложение не будет поддерживаться браузерами под Линуксом меня совсем не радует, потому ­— всё еще принимаю предложения.
Tags:
Hubs:
+19
Comments 46
Comments Comments 46

Articles