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 кидаем ведь

warren buffet 17.09.2016 20:41

himukami, специально для тебя предусмотрены события keyup и input. В честь события keyup ты можешь устроить митинг и скидывать с трибуны всех, кто не прошел фейсконтроль по образцу.

warren buffet 17.09.2016 20:46

Цитата:

Сообщение от himukami
но дает ввести любые значения

Ну и что? Неправильные значения нельзя будет отправить через интерфейс, пока юзер не введет правильные. На сервере все равно проверять еще раз, а на клиенте проверяют чтобы не гонять неправильные данные туда на проверку.

Ты какую-то свою реальность придумал. Паттерны тут посмотри http://html5pattern.com

warren buffet 17.09.2016 20:49

Например есть поле для ввода количества единиц товара. Кнопочки туе-мае, но в поле-то можно вписать и 0. Как быть? Так и быть, или запрещаешь отправку - юзер жмет отправить, а ему сообщение - Даун, 0 это не количество! - или вообще кнопка отправить задизаблена, или ты просто заменяешь 0 на 1 влет. Но такая замена влет полезна там, где все просто. А если ты будешь заменять скажем пробелы на черточки при вводе телефона, тебя будут материть.


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