Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   onkeydown при разных раскладках (https://javascript.ru/forum/events/30549-onkeydown-pri-raznykh-raskladkakh.html)

trololo 08.08.2012 01:57

onkeydown при разных раскладках
 
window.addEventListener('keydown',function(e){aler t(e.keyCode)},false)

например в опере нажимаем «z», если включена русская раскладка то koeyCode будет равно 1071, а при english - 90. можно ли как то идентифицировать клавишу при любых раскладках? если обрабатывать много кнопок то придется делать if(e.keyCode==90 || e.keyCode==1071), ну то есть, есть ли определённое свойство которое не зависит от раскладки, чтобы по нему безошибочно определить какая клавиша была нажата, без лишних движений?

devote 08.08.2012 02:14

e.which
<script>
window.addEventListener('keydown',function(e){alert(e.which)},false)
</script>

trololo 08.08.2012 03:00

Цитата:

Сообщение от devote (Сообщение 195554)
e.which
<script>
window.addEventListener('keydown',function(e){alert(e.which)},false)
</script>

не знаю, может у меня опера неправильная, но возвращается тоже самое число что и в keyCode.. firefox вообще 0 возвращает при русской раскладке. только в хроме нормально получается.

bes 08.08.2012 11:29

Это читали http://learn.javascript.ru/keyboard-events

trololo 08.08.2012 12:06

Цитата:

Сообщение от bes (Сообщение 195578)

ну вот даже тут ситуация не меняется http://learn.javascript.ru/keyboard-...ydown-и-keyup
Цитата:

Скан-код клавиши одинаков в любой раскладке и в любом регистре. Например, клавиша z может
означать символ "z", "Z" или "я", "Я" в русской раскладке, но её скан-код будет всегда одинаков: 90.
только у меня, почему то, совсем не то отображается в тестовом поле, z=90 я=1071, смотрю в браузере Opera/9.80 (X11; Linux i686; U; ru) Presto/2.10.289 Version/12.00

bes 08.08.2012 12:10

Ну мне не проверить, у меня в 12-й всё ок

bes 08.08.2012 12:15

Цитата:

Сообщение от trololo
совсем не то отображается в тестовом поле

что за поле, может там чего не так сделали, в исходном примере alert()

Deff 08.08.2012 15:14

<script type="text/javascript">

function LatRus(TxtTrans1,a){TxtTrans1=='lat'? TxtTrans1='rus':TxtTrans1='lat';
lat0='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~[].'.split('');
lat='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~'.split('');
lat.push('\\[');lat.push('\\]');lat.push('\\.');
rus=('йцукенгшщзфывапролджэячсмитьбЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁхъю').split('');
function transF(p){ar1=lat;ar2=rus;if(TxtTrans1=='lat'){ar2=lat0;ar1=rus}for(var i=0; i<ar1.length; i++){trans='/'+ar1[i]+'/gm';p=p.replace(eval(trans), ar2[i])}return p;} return transF(a)}


var a='Z njhjgk.cm e,tuf. yf hf,jne dtxthjv ,ele d bytnt b dc` hfccrf;e gjlhj,ytt\n\
Z тороплюсь e,tuf. на работу dtxthjv буду d bytnt b всё расскажу gjlhj,ytt'


alert(LatRus('lat',a))
</script>


Функция LatRus('rus',text) - будет преобразовывать в латиницу при любой раскладке (букву или фразу
далее через charCodeAt http://javascript.ru/String/charCodeAt

devote 08.08.2012 15:45

Deff,
ты немного забыл о том что инет юзают люди не только русские, но и украина например часто посещает русские сайты, да и еще есть некоторые.. поэтому тупой перевод букв на латиницу тут далеко не катит.. А свойство which должно корректно работать, и выдавать нормальный номер клавиши без учета кодировки... об этом четко описано в спецификации:
Цитата:

which holds a system- and implementation-dependent numerical code signifying the unmodified identifier associated with the key pressed. In most cases, the value is identical to keyCode.
дословно:
Цитата:

Сообщение от devote
unmodified identifier associated with the key pressed.

не измененный идентификатор нажатой клавиши

bes 08.08.2012 15:48

devote, неплохо бы ссылочку

Deff 08.08.2012 15:50

devote,
Ну не забыл - но да

trololo 08.08.2012 19:55

Цитата:

Сообщение от bes (Сообщение 195601)
что за поле, может там чего не так сделали, в исходном примере alert()

текстовое поле по ссылке, из мануала. цитата оттуда же.

bes 08.08.2012 20:01

Ну у меня на w7 всё нормально
Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.289 Version/12.00

trololo 08.08.2012 21:15

Цитата:

Сообщение от bes (Сообщение 195722)
Ну у меня на w7 всё нормально
Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.289 Version/12.00

странно, не думал что ось повлияет на работу js

devote 08.08.2012 22:39

Цитата:

Сообщение от bes
devote, неплохо бы ссылочку

http://www.w3.org/TR/DOM-Level-3-Eve...lemental-which

bes 09.08.2012 11:20

Цитата:

keyCode of type unsigned long, readonly
keyCode holds a system- and implementation-dependent numerical code signifying the unmodified identifier associated with the key pressed. Unlike the KeyboardEvent.key or KeyboardEvent.char attributes, the set of possible values are not normatively defined in this specification; typically, these value of the keyCode should represent the decimal codepoint in ASCII [RFC20][US-ASCII] or Windows 1252 [WIN1252], but may be drawn from a different appropriate character set. Implementations that are unable to identify a key use the key value '0'.

See Legacy key models for more details on how to determine the values for keyCode.

which of type unsigned long, readonly
which holds a system- and implementation-dependent numerical code signifying the unmodified identifier associated with the key pressed. In most cases, the value is identical to keyCode.
devote, приведённая фраза, из которой был сделан вывод, распространяется и на keyCode, видимо поправка ниже, как представленную информацию правильно осмыслить


Часовой пояс GMT +3, время: 19:01.