Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Правильно вешаем обработчик события (https://javascript.ru/forum/events/64829-pravilno-veshaem-obrabotchik-sobytiya.html)

himukami 08.09.2016 08:44

Правильно вешаем обработчик события
 
Приветствую!

Возник такой вопрос для знающих.

Предположим есть класс .only-one, и с помощью js устанавливается ограничение что в данное поле можно вводить только цифру 1

$('.only-one').on('keydown', function(key){
	return ((key.keyCode == 49);
});


Предположим, что поле с данным классом было добавлено в DOM поле AJAX запроса, соответственно на него не расспространится событие keydown и его (это событие) нужно указывать для вновь добавленного поля.

Есть два варианта:
1. Сделать это после успешного выполнения AJAX, т.е. в success callback повторить вызов функции
2. Изначально прописать событие немного по другому:

$('body').on('keydown', '.only-one', function(key){
	return ((key.keyCode == 49);
});


И тогда событие keydown будет "вешаться" автоматически на все поля с классом .only-one

Но вопрос как правильно поступить? Я не очень понимаю как работает событийная модель при втором способе записи. Подскажите плиз

рони 08.09.2016 08:50

himukami,
правильнее 1, проще 2.
дока по 2.
https://learn.javascript.ru/event-delegation

Rise 08.09.2016 09:00

himukami, вообще то правильно вешать на ближайшего статичного родителя, а не body и тому подобное...

warren buffet 08.09.2016 09:28

Цитата:

Сообщение от himukami
будет "вешаться"

Интересно а как жикверь узнает в своем .on() что хтмл обновился? Ихний аякс поджигает какое-то кастомное событие?

warren buffet 08.09.2016 09:33

А, понял, там же $('body').on()

Цитата:

Сообщение от himukami
Я не очень понимаю как работает событийная модель при втором способе записи.

Ну то есть жикверь на туловище вешает листенера калбек которого проверяет элемент класса .only-one на событие keydown и если все чики-пуки, то запускается уже твой калбек.

Ты не понимаешь из-за жиквери, я тож не сразу понял. Напиши сам микро-роутер и все будет ясно как пень.

warren buffet 08.09.2016 09:35

Rise, это жиквери-стайл, они не парятся такими деталями, масштабно мыслят, лал.

himukami 08.09.2016 10:19

Цитата:

Сообщение от рони (Сообщение 427978)

Спасибо за ссыль. Немного пересмотрел вешанье событий на однотипные элементы.

Цитата:

Сообщение от Rise (Сообщение 427979)
himukami, вообще то правильно вешать на ближайшего статичного родителя, а не body и тому подобное...

Да, я согласен. Если скажем речь идет о таблице, в которой некое действие идет со строкой, то конечно вашаем на table.
В моем примере просто поле с классом .only-one может быть где угодно, хотя скорее можно было повешать на form, все равно поле в форме (скорее всего :) )

warren buffet

Спасибо за пояснения :)

warren buffet 11.09.2016 06:56

himukami, ну так выкинь свой классовый мир на помойку истории и начни мыслить индустриально. Проверка полей - это валидация и зависит только от свойств поля. А какие у твоего поля свойства? Правильно - никакие. Свойства поля болтаются в натравленном на ЭТО поле скрипте. Натравливание скрипта на поле и создает синергию твоего говнокода.

А в промышленности делается наоборот. Скрипт одинаковый для всех полей, а поля имеют свойства.

warren buffet 11.09.2016 07:02

Цитата:

Сообщение от himukami
и с помощью js устанавливается ограничение что в данное поле можно вводить только цифру 1

И ты думаешь: Вот как классно я придумал - теперь достаточно навесить этот скрипт на любое поле и мои дети не будут голодать. И начинаешь навешивать лапшу сам себе на уши.

Сделай наоборот

<input type="number" max="1">

И тогда один и тот же скрипт проверит правильность любого поля просто сравнивая по правилу приделанному к самому полю.

Это частный случай, случаи более общего порядка реализуются через атрибут pattern

himukami 17.09.2016 20:38

Цитата:

Сообщение от warren buffet (Сообщение 428310)
Это частный случай, случаи более общего порядка реализуются через атрибут pattern

Вот проблема паттерна в том, что я не могу ограничить непосредственно ввод символов. Да хорошо, он не дает отправить форму, но дает ввести любые значения. Как добавить "отбрасывание" запрещенных символов? Все равно js кидаем ведь


Часовой пояс GMT +3, время: 16:57.