Как переписать .each() jQuery в ванильном Javascript | Джастин Талк

Чтение: 2 мин.

·

8 августа 2015 г.

Я создавал прототипы некоторых взаимодействий ввода формы для моего текущего проекта, и теперь, когда у меня есть несколько рабочих примеров, я хотел реорганизовать код чтобы избавиться от jQuery как зависимости и повысить производительность.

Чтобы правильно запускать анимацию, мне нужно, чтобы Javascript запускался при двух событиях: когда ввод получает фокус и когда ввод теряет фокус (и чтобы проверить, пуст ли ввод при этом).

С помощью jQuery такая привязка событий довольно проста:

Не должно быть слишком сложно преобразовать это в обычный Javascript, верно?

Однако этот код не работает. Почему?

Различия между jQuery и Javascript

И $(‘.text-input’), и .getElementsByClassName(‘text-input’) выбирают все элементы HTML с заданным классом, и оба возвращают массивоподобные объекты, но второстепенные разница между ними в том, что селектор Javascript возвращает NodeList. основное отличие заключается в том, что метод jQuery .on() может «присоединить функцию обработчика событий для одного или нескольких событий к выбранным элементам », тогда как метод .addEventListener() может работать только с единственной целью .

Итак, давайте рефакторим код, чтобы присоединить прослушиватель событий только к первому элементу (тому, что имеет позицию [0]) в объекте, подобном массиву.

Это работает, но чтобы распространить его на каждый элемент в массивоподобном объекте, нам необходимо реорганизовать код для циклического прохождения и присоединения прослушивателя событий к каждому элементу в массивоподобном объекте. Мы будем использовать метод Javascript .forEach() для однократного запуска функции для каждого элемента в массивоподобном объекте.

К сожалению, наш код снова дает сбой: в консоли появляется ошибка «inputs.forEach не является функцией». Это связано с тем, что метод .getElementsByClassName() не возвращает массив (у которого есть метод . forEach()) — он возвращает объект , подобный массиву . Массивоподобные объекты:

— имеют: индексированный доступ к элементам и длину свойства, которая говорит нам, сколько элементов имеет объект.
— не имеет: методов массива, таких как push, forEach и indexOf.

Два примера массивоподобных объектов являются результатом использования DOM-метода document.getElementsByClassName() (многие DOM-методы возвращают массивоподобные объекты) и аргументов специальной переменной.

Цикл по объекту, подобному массиву (старый способ)

Нам нужно сделать две вещи, чтобы выполнить цикл по объекту, похожему на массив, возвращаемому методом .getElementsByClassName().

  1. Получите доступ к методу Array.prototype.forEach(), доступному для реальных массивов,
  2. Используйте метод Function.prototype.call() для присвоения каждому элементу в массивоподобном объекте это значение в методе .forEach

Это выглядит так:

Успех! См.