Триггер пользовательских событий

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

    $(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"

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

Спасибо заранее! Матф

Ответ 1

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

Если вы сделаете кнопку слушателем (см. 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 более высокого уровня), явно не показано в документации я чувствую что это должно быть способом работы с именами. В этом случае вы можете начать охоту "ошибка или функция" .

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