Одноразовые обработчики событий — это функции, которые выполняются
только один раз при возникновении события и
автоматически удаляются после своего вызова. В библиотеке Cash для этого
используется метод .one(), который облегчает управление
событиями и уменьшает вероятность утечек памяти, связанных с множеством
невыполняющихся обработчиков.
.one()Синтаксис метода:
$(селектор).one(событие, [селектор_вложенного_элемента], обработчик);
Параметры:
событие — строка с названием события, например
"click", "mouseenter", "keydown".
Можно передавать несколько событий через пробел.селектор_вложенного_элемента — необязательный селектор
для делегирования событий на вложенные элементы.обработчик — функция, которая будет вызвана при
срабатывании события.Метод .one() возвращает объект Cash для возможности
цепочки вызовов.
// Одноразовый клик по кнопке
$('#button').one('click', function() {
console.log('Кнопка была нажата один раз');
});
После первого клика обработчик удаляется автоматически, последующие клики уже не вызывают функцию.
Одноразовые обработчики могут применяться к динамически создаваемым элементам через делегирование:
$('#list').one('click', 'li', function() {
console.log('Элемент списка был нажат один раз');
});
В этом примере обработчик назначается на контейнер
#list, но реагирует только на клики по вложенным элементам
li. После первого срабатывания обработчик удаляется для
конкретного элемента.
Метод .one() поддерживает привязку нескольких событий
сразу:
$('#input').one('focus blur', function(event) {
console.log(`Событие ${event.type} произошло один раз`);
});
Первое событие, которое произойдет (focus или blur), вызовет обработчик, и он больше не будет выполняться ни для одного из этих событий.
В метод .one() можно передать объект с данными, которые
будут доступны внутри обработчика через event.data:
$('#button').one('click', {count: 1}, function(event) {
console.log('Обработчик вызван один раз, count =', event.data.count);
});
Это удобно для передачи конфигурации или состояния, не создавая глобальных переменных.
.on()Метод .on() назначает постоянный обработчик, который
выполняется каждый раз при возникновении события:
$('#button').on('click', function() {
console.log('Кнопка нажата');
});
Отличие .one() заключается в автоматическом удалении
функции после первого вызова, что позволяет:
.one() не требуется, так как это делает библиотека
автоматически.this)
указывает на элемент, на котором произошло событие, как и в
.on()..one() может быть вызван на нескольких элементах
сразу, и обработчик будет удален только для того элемента, на
котором произошло событие.| Метод | Количество вызовов | Удаление обработчика |
|---|---|---|
.on() |
Неограниченно | Вручную через .off() |
.one() |
Один раз | Автоматически после срабатывания |
Использование .one() позволяет писать более
безопасный и оптимизированный код, избегая ошибок,
связанных с многократным срабатыванием обработчиков.