JQuery: более одного обработчика для одного события

Что произойдет, если я привяжу два обработчика событий к одному и тому же событию для одного и того же элемента?

Например:

var elem = $("...")
elem.click(...);
elem.click(...);

Выполняется ли последний обработчик "win" или будут выполняться оба обработчика?

Ответ 2

Предположим, что у вас есть два обработчика f и g и вы хотите убедиться, что они выполняются в известном и фиксированном порядке, а затем просто инкапсулируйте их:

$("...").click(function(event){
  f(event);
  g(event);
});

Таким образом, существует (с точки зрения jQuery) только один обработчик, который вызывает f и g в указанном порядке.

Ответ 3

jQuery.bind() срабатывает в том порядке, в котором он был связан:

Когда событие достигает элемента, все обработчики, связанные с этим событием тип для элемента. Если есть несколько обработчиков они будут всегда выполняться в том порядке, в котором они были связаны. После выполнения всех обработчиков событие продолжается вдоль путь распространения нормального события.

Источник: http://api.jquery.com/bind/

Поскольку jQuery другие функции (например, .click()) являются ярлыками для .bind('click', handler), я бы предположил, что они также запускаются в том порядке, в котором они связаны.

Ответ 4

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

$('#target')
  .bind('click',function(event) {
    alert('Hello!');
  })
  .bind('click',function(event) {
    alert('Hello again!');
  })
  .bind('click',function(event) {
    alert('Hello yet again!');
  });

Я думаю, что приведенный ниже код делает то же самое

$('#target')
      .click(function(event) {
        alert('Hello!');
      })
      .click(function(event) {
        alert('Hello again!');
      })
      .click(function(event) {
        alert('Hello yet again!');
      });

Источник: http://www.peachpit.com/articles/article.aspx?p=1371947&seqNum=3

TFM также говорит:

Когда событие достигает элемента, все обработчики, связанные с этим событием тип для элемента. Если есть несколько обработчиков они будут всегда выполняться в том порядке, в котором они были связаны. После выполнения всех обработчиков событие продолжается вдоль путь распространения нормального события.

Ответ 5

Оба обработчика вызываются.

Возможно, вы думаете о привязке привязки inline (например, "onclick=..."), где большой недостаток - это только один обработчик, который может быть установлен для событие.

jQuery соответствует модель регистрации событий DOM уровня 2:

Модель событий DOM позволяет регистрация нескольких событий слушателей на одном EventTarget. к добиться этого, слушатели событий не более долгое время сохраняются как значения атрибута

Ответ 6

Он успешно работал с использованием двух методов: инкапсуляции Stephan202 и нескольких прослушивателей событий. У меня есть 3 вкладки поиска, давайте определим их входной текстовый идентификатор в массиве:

var ids = new Array("searchtab1", "searchtab2", "searchtab3");

При изменении содержимого searchtab1 я хочу обновить searchtab2 и searchtab3. Это было сделано для инкапсуляции:

for (var i in ids) {
    $("#" + ids[i]).change(function() {
        for (var j in ids) {
            if (this != ids[j]) {
                $("#" + ids[j]).val($(this).val());
            }
        }
    });
}

Несколько прослушивателей событий:

for (var i in ids) {
    for (var j in ids) {
        if (ids[i] != ids[j]) {
            $("#" + ids[i]).change(function() {
                $("#" + ids[j]).val($(this).val());
            });
        }
    }
}

Мне нравятся оба метода, но программист выбрал инкапсуляцию, однако также работали несколько прослушивателей событий. Мы использовали Chrome для его проверки.

Ответ 7

Существует обходное решение, гарантирующее, что один обработчик происходит за другим: присоедините второй обработчик к содержащему элементу и дайте событию пузырь. В обработчике, прикрепленном к контейнеру, вы можете посмотреть event.target и сделать что-то, если оно вас интересует.

Грубый, может быть, но он определенно должен работать.