Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как заменять раскладку клавиатуры событием .on('input')?

Константин Ефименко Гуру (3721), закрыт 4 года назад
Мне необходимо менять раскладку клавиатуры, при вводе текста в input. Сейчас у меня такой код:

const Ru = "йцукенгшщзхъфывапролджэячсмитьбю",
En = "qwertyuiop[]asdfghjkl;'zxcvbnm,.";
const RuEn = [...En].reduce((a, e, i) => (a[e] = Ru[i]) && (a[e.toUpperCase()] = Ru[i].toUpperCase()) && a, {});
var corrected = 0;

$('#ta').on('input', function() {
var $th = $(this),
val = $th.val(),
end = $th.prop('selectionEnd');
for (var i = !!corrected * (val.length - corrected - 1); i < end; i++) {
var s = RuEn[val[i]];
if (s) this.value = val.split(val[i]).join(s);
}
});

Данный способ не очень хороший, так как, он не распознаёт регистр таких букв как - [Х, Ъ, Ж, Э, Б, Ю] и выводит только в верхнем регистре. Есть ли, какое-то хорошее решение, полностью на jQuery?
Лучший ответ
Андрей Высший разум (425191) 4 года назад
Убери toUpperCase и делай сравнение ВСЕХ символов:
Ru = "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ"
En = "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>"

А проще - сделать структуры:
{'q': 'й', 'w': 'ц', ..} и {'й': 'q', 'ц': 'w', ..}
и преобразовывать символы прямым обращением по индексу.
Константин ЕфименкоГуру (3721) 4 года назад
Касательно первого решения. Работает замечательно, но возникает вопрос, а как быть с Caps Lock? Он игнорируется при проверке тех же самых символов.

А по поводу структуры,.. проще??? Если в 2 раза больший, огромный массивный код это проще, то тогда я просто пингвин.

Мне наоборот компактный код по душе.
Андрей Высший разум (425191) 66 элементов (про Ё забыл) ты считаешь ОГРОМНЫМ массивом? Спасибо, рассмешил. Это массив ничтожно малого размера.
Константин ЕфименкоГуру (3721) 4 года назад
Возвращаясь к сути вопроса, есть ли данное решение, именно на чистом jQuery?
Андрей Высший разум (425191) Чистый jQuery ничего не знает ни про раскладки клавиатуры, ни про русский язык. Впрочем, вполне возможно, что на github есть готовый модуль с таким функционалом. Вот, например, обсуждение этой темы на числом JS: https://javascript.ru/forum/dom-window/30215-kak-ispravit-raskladku-klaviatury-v-zadannojj-oblasti-textarea-2.html
Остальные ответы
Похожие вопросы