2011-08-19 13 views
26

Czy istnieje jakiś sposób dołączania danych do obiektu zdarzenia jQuery, ponieważ propaguje do DOM?modyfikować dane zdarzeń podczas propagacji

Aby wyjaśnić, jeśli masz trzy zagnieżdżone divy, każdy z detektorem zdarzeń kliknięcia, a następnie kliknięcie najbardziej div powoduje, że wszystkie trzy procedury obsługi wywoływane są od najbardziej wewnętrznej do najbardziej zewnętrznej (propagacja zdarzenia 101). Chciałbym dodać trochę danych do obiektu zdarzenia w każdej procedurze dostępnej dla następnej warstwy. Jak mogę to zrobić?

Dzięki.

Odpowiedz

2

Może ja źle na pytanie, ale natknąłem się na tej stronie StackOverflow jednocześnie szukając sposobu, aby zrobić to samo.

Od tamtej pory odnalazłem, że możesz zwrócić wartość/wartości, które chcesz przekazać na końcu każdej procedury obsługi, a następnie uzyskać do nich dostęp w kolejnych programach obsługi przy użyciu właściwości event.result?

Proste demo na http://api.jquery.com/event.result/

4

Chociaż nie można dołączyć dane bezpośrednio do zdarzenia, można jeszcze dołączyć dane do targetElement poprzez jQuery data():

$('div').click(function(e) { 
    var info = $(e.target).data('info') || ''; 
    $(e.target).data('info', info + ' ' + $(this).attr('class')); 
}); 

Oto skrzypce: http://jsfiddle.net/eKVmU/

+0

to rozwiązanie działa po raz pierwszy impreza jest zwolniony, ale dane nie ustępuje przez wielu zdarzeń (na jsfiddle, kliknij kilka razy i zobaczyć, co się dzieje). Naprawdę podobał mi się sposób kojarzenia danych z konkretnym kliknięciem, gdy jest wypluwany, w przeciwieństwie do konkretnego elementu ... – josh

+0

@josh - Dlaczego po prostu nie usuniesz danych, gdy dotrze do najbardziej zewnętrznego elementu? [Patrz tutaj] (http://jsfiddle.net/eKVmU/7/). –

+0

Rewizja jest uwzględniana, ponieważ nie odpowiada na pytanie zadane przez OP: "dołączanie danych do obiektu zdarzenia jQuery". Druga najwyższa głosowana odpowiedź właśnie to i powinna być na wierzchu, a zaakceptowana odpowiedź ... –

36

Obiekt zdarzenia, który jest przekazywany przez jQuery jest opakowaniem wokół natywnego obiektu zdarzenia. Bulgotanie odbywa się na poziomie javascript/browser, a więc rodzimy obiekt zdarzenia wydaje się być wspólny dla wszystkich procedur obsługi zdarzeń.

$('div').click(function(e) { 
    e.originalEvent.attribute = (e.originalEvent.attribute || "") + 
     " " + $(this).prop("className"); 
    alert(e.originalEvent.attribute); 
}); 

Testowany w przeglądarce Chrome, Firefox, Safari, IE9 i IE10. Jeśli testujesz w innych przeglądarkach, skomentuj wyniki.

Oto skrzypce: http://jsfiddle.net/5AQqD/

+2

Właśnie przetestowałem to na IE10/9 i Prace. To powinno być prawidłowe rozwiązanie. –

+0

bummer, bez wsparcia IE8. – johntrepreneur

+0

Dokładnie tego potrzebowałem, dziękuję. To powinno być naprawdę udokumentowane na MDN. – nils

Powiązane problemy