Просто выберите ребенка input
.value
вместо $el
.value
:
const $searchField = document.querySelectorAll('.js-search');
$searchField.forEach(function($el) {
// $el = .js-search
$el.addEventListener('click', function() {
$el.classList.add('is-active');
});
const input = $el.querySelector('input');
input.addEventListener('keyup', function() {
if (input.value.length > 0) {
$el.classList.add('is-active');
} else {
$el.classList.remove('is-active')
}
});
});
Обратите внимание, что нет необходимости в проверке if
, если вы не хотите - вызов forEach
для пустой коллекции не выдаст ошибку, он просто не будет перебирать что-либо.
Вы также можете рассмотреть возможность включения полифилла для NodeList.prototype.forEach
(если вы этого еще не сделали), так как старые браузеры не поддерживают его. (Либо, преобразуйте коллекцию в массив или используйте Array.prototype.forEach.call
)
Немного основанный на мнении, но нет необходимости добавлять префикс имен к $
- это не PHP. Часто префикс $
делается, когда указывается, что что-то является коллекцией jQuery ($
). Если вы выполняете манипуляции с DOM, вероятно, лучше не использовать имя переменной, начинающееся с $
, чтобы избежать путаницы для будущих читателей вашего кода.