JavaScript

Посмотрите пожалуйста задание. Всё работает. Тем не менее, интересно услышать замечания по коду.

Можно ли сделать код короче? Какие ошибки
Условие задания: При вводе текста в input в момент нажатия клавиши - подсветить ее, в момент отпускания - возвращайте к первоначальному состоянию. Если нажата клавиша caps lock - то присвоить ей подсветку, которое работает до последующего отжатия клавиши.
________________________________________
Код здесь:
codepen.io/vvv7220/pen/jOqLMqG?editors=0010
________________________________________

Да вроде нет ошибок)

1) Только, не желательно называть функции одной буквой, если из контекста кода не понятно, о чем эта буква)

function t() → function light_on(), например

2) let k = document.querySelectorAll('.key'); — каждый раз при нажатии кнопки происходит поиск всех элементов и дальнейший перебор для нахождения нужного. Было бы хорошо один раз собрать их в объект и при нажатии кнопки - сразу по "адресу" взять нужжный элемент.

3) .onkeydown — в одном месте `on`, а в другом сразу eventListener) Его тоже можно записать как .addEventListener("keydown", ..)

4) функция названа `cplKeypress` а вызывается при "keydown" — может запутать.
______

В общем-то, добавил бы data-code="CapsLock" в HTML и записал бы примерно так:

( https://jsfiddle.net/hs1zaLed/ )

let getElementByCode = (function create_function() {
  let _storage = {};

  let keys = document.querySelectorAll('.key');
  for (let i = 0; i < keys.length; i++) {
    _storage[ keys[ i ].dataset.code ] = keys[i];
  }

  /* На выходе получается:
   *   _storage = {
   *     "KeyA": html-объект,
   *     "KeyB": html-объект,
   *     ...
   *     "CapsLock": html-объект,
   *     ...
   *   }
   */

  return function(code) {
    // эта функция получает имя getElementByCode
    return _storage[code] || null;

    // А при вызове, например, getElementByCode("KeyA") —
    // сразу вернет этот html-объект из _storage, без доп поиска.
  }
})();

set_light_features();

function set_light_features() {
  let input = document.querySelector('.i');

  input.addEventListener("keydown", light_on);
  input.addEventListener("keyup", light_off);

  function light_on(event) {
    let action = (event.code == "CapsLock") ? "toggle" : "add";
    // Если капс - переключать класс, иначе - добавлять.

    getElementByCode(event.code).classList[action]("onlight");
  }

  function light_off(event) {
    if (event.code == "CapsLock") return;

    getElementByCode(event.code).classList.remove("onlight");
  }
}

____________

getElementByCode — мог бы быть частью бОльшего объекта, а не создаваться так "в лоб". В рамках песочницы - так.
____________

Если гнаться за краткостью, можно вообще выбросить вспомогательную функцию, и брать элементы по селектору атрибута:
document.querySelector('[data-code="' + event.code + '"]');
Евгений С.
Евгений С.
62 360
Лучший ответ
Шыныбек [Джумагалиев] 1)AddEvent.. пришлось сделать в процессе. Капс лок не хотел работать el.onkeydown. Тут вспомнил что кто то уже говорил, что если на одном элементе работают много функций, то лучше через AddEvent делать. 2)keypress тоже не хотел работать на капслоке почему то, поэтому переделал, а название забыл.
3) спасибо за анализ кода. Мне это было важно. Приму к сведению)
>> Тем не менее, интересно услышать замечания по коду.
Поверь, лучше не сто́ит)))
Ревьюить имеет смысл только продакшн-код... а то что в вопросе, пока что не годится в продакшн, без обид.

Следует очень серьезно поработать над безопасностью (safety, не security), организацией (прочь утилити-функции), актуальностью (прочь on*, нагромождение счетчиков, ‎ ‎..‎.), и оформлением кода.
А пока эти моменты не подтянуты - советую относиться к коду честно: "ну вроде работает, и хрен с ним". Костыль не обязан быть изящным.

Проще говоря: вылизывание конкретно этого маленького кусочка, тебе ничего не даст. Пустая трата сил. А вот если улучшишь сам подход к написанию JS, то это сильно продвинет вперед ВООБЩЕ ВЕСЬ код который ты напишешь в дальнейшем. Ты освоил базу, это хорошо, но теперь пора двигаться дальше.
Шыныбек [Джумагалиев] мне просто было интересно узнать как профи решают такую задачу. Конечно это не продакшн. Просто учебное задание по событиям клавиатуры. )
Шыныбек [Джумагалиев] Нет конечно ничего дурного не в обычности, ни даже в умственной отсталости. Это даётся от природы. Я знаю одного дауна, он великолепно играет на баяне. Его никто не учил особенно. В детстве подарили гармошку. И он до сих пор с ней не расстаётся. На слух любую песню играет, даже не зная нотной грамоты. Он добрый и общительный человек, но к сожалению умственно отсталый.