Подтвердить что ты не робот

JQuery: добавляет ли прослушиватель событий перезапись предыдущего прослушивателя того же события?

Например, допустим, что у меня есть

$(element).on('click', function() {/*Some Stuff*/});

где-то определенно, а затем я хочу добавить дополнительные функции к тому же событию клика. Если я делаю

$(element).on('click', function() {/*Other Stuff*/});

будет ли "Other Stuff" перезаписываться "Some Stuff"?

4b9b3361

Ответ 1

Второй прослушиватель не будет переопределять первый. Обработчики событий jQuery добавляются кумулятивно и выполняются в том порядке, в котором они были прикреплены.

Вещь, которая влияет на то, предотвращает ли один обработчик другой запуск, как функция отменяет обработчик кликов по умолчанию браузера (т.е. как вы останавливаете браузер по URL-адресу ссылки)

Если вы используете традиционный метод:

$(element).on('click', function() {

    /* Some Stuff, do your thing */ 

    return false; 
});

Обработчик выше остановит само событие и распространится на другие обработчики.

Но вы можете остановить действие события, не останавливая его распространение или обработчик:

$(element).on('click', function(e) {

    // prevent the default action at first, just to make it clear :)
    e.preventDefault(); 

    /* do your thing */

    return /* what you want */;
});

Это гарантирует, что действие по умолчанию для кликов не произойдет, но событие продолжит работу с другими hanlders. Событие jQuery также имеет некоторые другие полезные методы распространения событий (например, Event.stopPropagation()), которые стоит узнать.

Ответ 2

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

Это типичное использование шаблона наблюдателя.

События можно удалить с помощью http://api.jquery.com/off/ или http://api.jquery.com/die/ в случае использования .live.

Ответ 3

Нет, не будет. on() аналогичен bind - он добавляет событие в $.data("events")

Вы можете явно удалить вещи через off(), хотя.

Ответ 4

Вы неправильно поняли; добавление другого обработчика не перезаписывает первый.

Смотрите это jsFiddle: http://jsfiddle.net/ymuBs/

Нажатие на ссылку записывает "один" на консоль. При нажатии кнопки добавляется другой обработчик ссылки. Теперь нажмите ссылку "1" и "два" на консоль:

Ответ 5

Это уже был дан ответ, но я подумал, что добавлю, как обычно я обращаюсь к этой проблеме, когда я нахожусь в ситуации, когда я мог бы получить дубликат кликов.

Я просто использую методы запроса и выключения пользователя...

$(элемент).off('click');//Удаляет ранее добавленный кликер с помощью метода on

$(element).on('click', function() {/Some Stuff/});//Добавляет его обратно и работает только один раз

http://api.jquery.com/off/

Метод .off() удаляет обработчики событий, которые были связаны с .on(). См. Обсуждение делегированных и непосредственно связанных событий на этой странице для получения дополнительной информации. Вызов .off() без аргументов удаляет все обработчики, прикрепленные к элементам. Конкретные обработчики событий могут быть удалены по элементам, путем предоставления комбинаций имен событий, имен, селекторов или имен функций обработчика. Когда задано несколько аргументов фильтрации, все предоставленные аргументы должны совпадать для удаления обработчика события.