Здравстуйте, уважаемое хабрасообщество. Реквестирую консультацию.
Позавчера, во время разработки jQuery.keyboard столкнулся с абсолютной браузерной несовместимостью, ужасно неприятной непоследовательностью и т.д. в возврашении значения event.keyCode в различных браузерах. На удивление, единственный, кто меня порадовал — IE 6 (ies4linux) и больше всех огорчила — опера 10. Хромиум и фокс же ж вернули приблизительно одинаковый результат.
Итак, сперва — код теста:
Позавчера, во время разработки 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 += i + ":" + obj[i] + "; ";
}
return dump;
}
document.onkeydown = function (e) {
e = e || event;
keys[e.keyCode] = 1;
body.innerHTML += dumpObj(keys) + "<br />";
}
document.onkeyup = function (e) {
e = 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 подобных проблем ни в одном браузере нет? Неужели это проблема только в браузерах под Линукс, продолжение истории с русской раскладкой в фоксе? Если так, то, пожалуй, придётся писать три баг-репорта. Но идея, что моё приложение не будет поддерживаться браузерами под Линуксом меня совсем не радует, потому — всё еще принимаю предложения.