Может ли в jq одинаковое событие вешаться несколько раз?

В jq одинаковое событие может вешаться несколько раз? Например, в функции есть онклик, эта функция вызывается несколько раз, то есть каждый раз вешается новый экземпляр онклика?
P.S.: код не мой, разбираю завал, не могу понять, почему отрабатывают онклики по нескольку раз.
  • Вопрос задан
  • 4362 просмотра
Решения вопроса 2
benderskiy
@benderskiy
Варианты решения в порядке «чистоты»:
1) переработать код так, чтобы повторные биндинги не происходили
2) вызывать .off. Если есть вероятность, что на одном элементе есть разные обработчики одного типа эвентов, то посмотреть в сторону api.jquery.com/event.namespace
3) Проверять, есть ли уже нужный нам биндинг. Такой способ, например:
jQuery._data($(SELECTOR)[0], 'events').EVENT_TYPE вернет массив забиндиных эвентов выбранного типа. если его длинна >= 1, то снова биндить не нужно. Опять же, namespaces, как и во втором варианте
Пример
var isBound($element, event) {
    var events = jQuery._data($element[0], 'events').event;
    if (events && events.length) {
        return true;
    } else {
        return false;    
    }
}

if (!isBound($('#button'))) {
    $('#button').on('click', function);
}
Ответ написан
Комментировать
GM2mars
@GM2mars
Очень часто встречался с такой проблемой, пока ничего лучше не нашел как перед каждой привязкой к событию делать отвязку от него:

$(document).off('click', '.element');
$(document).on('click', '.element', function() {
  alert('ta-da!');
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@rsludge
Да, может. Только это не одинаковое событие, а на одно событие вешаются несколько обработчиков, а разные они или одинаковые браузер не волнует.
Ответ написан
onClick - это событие, оно же замыкание. И поэтому может существовать независимо от другого кода и замыканий. Поэтому можно навешать сколько угодно одинаковых событий на объект.

Как с этим бороться:
- Чтобы события не перекрывали друг друга, нужно при назначении нового события затирать старое. Затереть старое событие можно используя функцию bind с указателем на пространства имён. Других корректных способов нет.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы