2013-10-07 6 views
4

У меня возникла проблема с пользовательским событием jQuery и прослушиванием его через делегирование в зависимости от того, как инициируется событие. Строковое событие корректно запускается на обоих тэгах. Однако объект jQuery.Event запускается только при непосредственном связанном теге p. Я подготовил скрипку, чтобы продемонстрировать: http://jsfiddle.net/s35bg/jQuery пользовательское событие через объект не запускается

Вот HTML:

<p class="delegation">Via delegation:</p> 
<p class="direct">Directly:</p> 

И JavaScript:

$(function() { 
    // bind using delegation 
    $(document).on('create', 'p.delegation', function (e) { 
     if (e.test) { 
      $(this).append(' $.Event'); 
     } else { 
      $(this).append(' string'); 
     } 
    }); 

    // bind directly 
    $('p.direct').on('create', function (e) { 
     if (e.test) { 
      $(this).append(' $.Event'); 
     } else { 
      $(this).append(' string'); 
     } 
    }); 

    // trigger the event with a string 
    $('*').trigger('create'); 

    // trigger the event with an object 
    var event = $.Event('create'); 
    event.test = true; 
    $('*').trigger(event); 
}); 

Результат:

Via delegation: string 
Directly: string $.Event 

Я ожидаю:

Via delegation: string $.Event 
Directly: string $.Event 

Мой вопрос в том, почему это так? Являются ли мои ожидания неправильными или неправильно jQuery? Заранее спасибо!

+1

Я думаю, что есть ключ в том, что если вы измените триггер '$ ('*')' в '$ ('p') ', результатом является:' Через делегирование: string $ .Event $ .Event', как будто событие запускается как непосредственно, так и на пузыре. Я признаю, что я озадачен, но мне интересно о взаимодействии между триггером(), селектором '' * ''и делегированными событиями. – Palpatim

+0

@ Палпатим, который, на мой взгляд, тоже удивляет. – morris4

ответ

1

изменить последнюю строку.

Перед:

var event = $.Event('create'); 
event.test = true; 
$('*').trigger(event); 

после:

$('*').trigger({type:'create', test:true}); 
+1

Это определенно работает, но на самом деле он не отвечает на вопрос: почему он работает, пока идиома объявления нового объекта «Событие» не выполняется? Любые указатели? – Palpatim

+0

Спасибо, это может быть обходной путь, который я искал! Хотя, как говорит @Palpatim, это не совсем объясняет поведение выше. Примите это, если обходной путь идет хорошо. – morris4

+0

@Palpatim - событие «создать» - это событие, которое не поддерживается документом. Последняя строка кода «$ ('*'). Trigger ('create')« При нормальной работе вы можете это увидеть. – babonamu

Смежные вопросы