splincodewd
@splincodewd
Developer

Что плохого в навешивании событий на инпуты?

Написал такой код, для добавления, удаления рамки у полей формы
Но мне сказали, что это не эффективно с точки зрения потребления памяти (если полей будет 100500)
Объясните, как правильно нужно вешать события на инпуты?

jsfiddle.net/omaxphp/xxmfxptz

<form id="formElement">
    One: <input type="text"><br>
    Two: <input type="text">
</form>


.focused {
    outline: solid 2px red;
}


// returns NodeList
var input_list = document.querySelectorAll('#formElement input'); 
// converts NodeList to Array
var input_array = Array.prototype.slice.call(input_list); 

input_array.forEach(function(input){
	
  input.onfocus = function(){
  	this.classList.add('focused');
  }
  
  input.onblur = function(){
  	this.classList.remove('focused');
  }
  
})
  • Вопрос задан
  • 291 просмотр
Решения вопроса 3
@IceJOKER
Web/Android developer
используйте css www.w3schools.com/cssref/sel_focus.asp , зачем лишний раз юзать JS.

input:focus{
    outline: solid 2px red;
}


И зачем лишние операции, зачем превращать NodeList в массив? Перемудрили для такой простой задачи.

А насчет эффективности - если вы знаете примерно как работает код, то не важно, что под капотом, вы должны понимать, что это лишние операции - браузер сначала ищет все элементы удовлетворяющие условию(querySelector), потом все это дело превращает в массив, потом проходит по каждому элементу и вешает обработчик
Ответ написан
trevoga_su
@trevoga_su
не эффективно с точки зрения потребления памяти (если полей будет 100500)
код твой гумно, MaxKorz показал тебе как правильно.

Но вот насчет памяти - это кто такой умный, который о памяти в рамках скрипта на 5 строк рассуждает? Наверное какой-нибудь тим-лид, сидящий рядом?
Ответ написан
Комментировать
@Myateznik
Для такого случая лучше использовать обычный css код:
#formElement input:focus {
    outline: solid 2px red;
}

Не делайте лишних велосипедов, когда это уже давным давно сделано.
Это не эффективно из-за того, что в случае с css стилями при фокусе браузер просто нарисует элемент основываясь на уже известных данных тем самым происходит просто перерисовка тайлов, а в случае с js происходит изменение DOM, браузер снова проходит по всему дереву DOM, далее браузер ищет стили в CSSOM и только потом отрисовывает изменившееся, пока браузер совершает это путешествие возникает некий провис.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 15:01
35000 руб./за проект
19 апр. 2024, в 14:12
30000 руб./за проект