Страницы

Поиск по вопросам

четверг, 2 мая 2019 г.

JS замена значения нажатой клавиши на другое

Здравствуйте, как можно заменить значение нажатой клавиши на другую, например, на ходу изменить регистр. Пытался это сделать через изменение свойств объекта события keydown, если все правильно понимаю то оно предшествует вставки символа в поле, а потом уже идет keyup. Еще была мысль искусственно вызвать прекратить событие, и вызвать новое но с другой клавишей но не знаю как можно в вызываемое событие вложить объект и тем более с какими свойствами. Как это можно реализовать или есть какая то альтернатива для решения этой задачи?


Ответ

var el = document.getElementById('a'); el.onkeypress=function(e){ if(!e)e=window.event; var k = e.key; if(!k)k=String.fromCharCode(e.keyCode); k = (k.toLowerCase()==k)?k.toUpperCase():k.toLowerCase(); // меняем регистр if('number'==typeof el.selectionStart){ var v = el.value; var sel1 = el.selectionStart; el.value = el.value.substr(0,el.selectionStart) + k + el.value.substr(el.selectionEnd); el.selectionStart=el.selectionEnd=sel1+k.length; } else { // выделение в IE не работает, так что просто добавляем в конец el.value += k; } // что-то из этого не нужно. if(e.preventDefault)e.preventDefault(); if(e.stopPropagation)e.stopPropagation(); e.cancelBubble = true; return false; };
Всё с заменой не так просто.
keydown и keyup более, так сказать, "низкоуровневые" - они вызываются именно в моменты нажатия и отпускания клавиши.
Нужное для замены событие, keypress, вызывается когда должен напечататься один символ. Например, при нажатии Shift keypress не выстрелит, а если нажать и держать какую-нибудь букву - событие keypress будет стрелять на каждый появившийся символ.
Увы, симулировать нажатие кнопки пользователем в браузере невозможно.
Событие-то создать и выстрелить им в элемент можно (new KeyboardEvent("keyup",{"key":"a"}), как подксказывает Alex Krass), только оно не приведет к появлению символа в поле ввода (или редактируемом блоке), хотя и вызовет все javascript-обработчики (если они есть).
Выход один - работать с выделением. Нужно рассчитать, что произойдет с текстом (и позицией курсора) в поле после нажатия кнопки. И если в случае с 'ом и не-IE всё более-менее просто, то с

и со старыми IE всё очень плохо.
Кстати, пользователь может ещё вставить что-нибудь из буфера (событие paste).

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

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