2011-01-17 2 views
10

Я в тупике о том, как пользовательские события с именами должны работать в jQuery. У меня создалось впечатление от the doc, что запуск пользовательского события с именами приведет к тому, что обработчики обработают только определенные события. Вместо этого кажется, что пространство имен в значительной степени игнорируется. Пример ниже и живой код здесь: http://jsfiddle.net/kZCBw/1/Namespaced Custom Events Trigger

$(document) 
     .bind("reset.one", function(){ console.log("reset.one event detected");}) 
     .bind("reset.two", function(){ console.log("reset.two event detected");}) 
     .bind("cheese", function(){ console.log("cheese event detected");}); 

     $("#btn1").click(function(){ 
      console.log("firing reset.one event"); 
      $(this).trigger("reset.one"); 
     }); 
     $("#btn2").click(function(){ 
      console.log("firing reset.two event"); 
      $(this).trigger("reset.two"); 
     }); 
     $("#btn3").click(function(){ 
      console.log("firing reset event"); 
      $(this).trigger("reset"); 
     }); 

     //btn1 click should only trigger handlers bound to "reset.one" 
     //and yet it triggers anything starting w/ "reset" 

Что мне не хватает?

Заранее благодарен! -matt

+0

Замечание: отлично работает с jQuery 2.1.4 и jQuery 3.0 – ViRuSTriNiTy

ответ

11

Я могу, по крайней мере, подтвердить ваш пример, добавить наблюдение.

Если вы сделаете кнопку слушателем (см. http://jsfiddle.net/kZCBw/2/), лучше отражая образец кода в документации, он работает так, как ожидалось.

Но если вы переместите его куда-нибудь выше в дереве DOM (см. http://jsfiddle.net/kZCBw/3/), он терпит неудачу.

Сначала я подозревал, что это произошло потому, что пространство имена не барботирование с объектом события, но я добавил следующий код (живой пример на http://jsfiddle.net/kZCBw/4/):

$('*').bind('reset', function(e){ 
    console.log(e.type + '.' + e.namespace + ' detected at ' + e.currentTarget); 
}); 

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

В то время как поведение, которое вы ищете (пространство имен остается эффективным на узлах DOM более высокого уровня), явно не показано в documentation, я считаю, что это должно быть способом работы с именами. В этом случае вы можете начать охоту «ошибка или функция».

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

+0

+1 Для v хорошего ответа. Обратите внимание, что подходящим свойством для тестирования является 'e.namespace'. – lonesomeday

+0

Благодаря lonesomeday за добрые слова и полезные советы. Примечание к OP: вы можете получить руководство по использованию EventObject в [jQuery documentation] (http://api.jquery.com/category/events/event-object/). В качестве альтернативы просто введите 'console.log (e)', где 'e' был назначен экземпляру EventObject, даст вам очень быстрый обзор объекта и поможет вам развить интуицию о том, как его использовать. –

+0

Спасибо Стивен и lonesomeday. после некоторого дополнительного копания выясняется, что это известная проблема. См.: Http://bugs.jquery.com/ticket/6913, поэтому да, кажется, единственный вариант сегодня - проверить пространство имен/имя класса – busticated