Назначение клавиш пользователем

78
27 ноября 2020, 22:50

Нашёл на одном сайте такую приколюху, что пользователь может изменять назначение каждой клавиши - как ему удобно и мне бы хотелось сделать подобное на своём сайте, но нигде информации об этом не нашёл. Вот и возникает вопрос - как сделать так, чтобы пользователь сам мог изменять назначение каждой клавиши и, если ему это будет не удобно, он мог сбросить значения по умолчанию? Буду рад вашей помощи :)

Answer 1

Хмм... ну мой вариант будет не идеальным, но минимальную демонстрацию обеспечит.

Тут наверно главная фишка в том, чтобы знать про keyup, который умеет определять нажатую кнопку. Изначально персонаж настроен двигаться направо и налево при нажатии правой и левой стрелок. Изменение происходит сразу при введении любой другой кнопки в инпуты (не заморачивался с кнопкой 'ok'):

JsFiddle ДЕМО

(function(){ 
 
const bubu = document.getElementById('bubu'); 
let left = 0; //Изначально позиция 0 
 
//Кнопки, нажатие которых будем сравнивать перед действием 
let RMove = 'ArrowRight';  
let LMove = 'ArrowLeft'; 
 
document.addEventListener('keyup', function(e){ 
  //Создаем регулярные выражения, с которыми будем сравнивать нажатую кнопку,  
  //Которую можно получить через "e.key" 
  let RMoveKey = new RegExp( RMove, 'ig' ); 
  let LMoveKey = new RegExp( LMove, 'ig' ); 
   
  //При нажатии кнопки сравнили - если совпало с заранее сохраненной кнопкой -  
  //Обновляем значение позиции left и сдвигаем куда надо. 
  if( e.key.match( RMoveKey ) ) { 
    left += 50; 
    bubu.style.left = left + 'px'; 
  } 
  if( e.key.match( LMoveKey ) ) { 
    left -= 50; 
    bubu.style.left = left + 'px'; 
  } 
}); 
 
document.getElementById('ChangeR').addEventListener('keyup', function(e){ 
  //А при введении новой кнопки, просто обновляем изначальное значение  
  //Переменной, в которой должна храниться сравниваемая кнопка. 
  RMove = e.key; 
  document.querySelector('#ChangeR + span').innerHTML = 'Теперь персонаж будет передвигаться направо с помощью кнопки <span style="color: red;">' + e.key + '</span>'; 
}); 
 
document.getElementById('ChangeL').addEventListener('keyup', function(e){ 
  LMove = e.key;   
  document.querySelector('#ChangeL + span').innerHTML = 'Теперь персонаж будет передвигаться налево с помощью кнопки <span style="color: red;">' + e.key + '</span>'; 
}); 
 
})();
/* Ненужная декорация */ 
#bubu {width: 50px; height: 50px; background: orange; border-radius: 50%; padding-top: 20px; text-align: center; box-sizing: border-box; position: absolute;}
<div id="bubu">o_o</div> 
 
<br><br><br><br> 
 
<input id="ChangeR" placeholder="Движение направо"><span></span><br><br> 
<input id="ChangeL" placeholder="Движение налево"><span></span>

keypress тоже умеет подобное, но не все кнопки умеет определять.

READ ALSO
Получение данных пользователей во vue.js. Json api

Получение данных пользователей во vue.js. Json api

Составил на сервере (laravel) json запрос, который получает комментарии статьи

79
setInterval / setTimeout / clearInterval - Валидация поля - Нужна помощь по поводу ОСТАНОВКИ ТАЙМЕРА после &ldquo;Вставки&rdquo; значения через контекстное меню

setInterval / setTimeout / clearInterval - Валидация поля - Нужна помощь по поводу ОСТАНОВКИ ТАЙМЕРА после “Вставки” значения через контекстное меню

Событие keyup - пока печатается всё с клавиатуры - всё хорошоПользователь вводит текст, обработчик проверяет на правильность и если что-то неправиьлно...

111
Динамическое добавление блока

Динамическое добавление блока

у меня есть небольшая форма которая представляет из себя чек, в которой в селекте выбирается товар и рядом в инпуте количество этого товараВ...

89
Как правильно добавлять новую DOM Node?

Как правильно добавлять новую DOM Node?

Вырезал пример из моего проекта и сильно упростил: Данный код создаст один нужный мне фрагментДело в том, что я хочу создавать неограниченное...

105