backbone.js - zdarzenia, wiedząc, co zostało kliknięte

96

W jednej z moich klas widoku backbone.js mam coś takiego:

...

events: {
  'click ul#perpage span' : 'perpage'
},

perpage: function() {
  // Access the text of the span that was clicked here
  // Something like: alert($(element).text())
},

...

ponieważ mój znacznik na stronie może mieć coś takiego:

<ul id="perpage">
  <li><span>5</span></li>
  <li><span>10</span></li>
</ul>

Jak więc dokładnie mogę znaleźć informacje o elemencie, który spowodował zdarzenie? Czy w tym przypadku zostało to kliknięte?

Mateusz
źródło

Odpowiedzi:

132

Zwykle w powiązaniu zdarzenia po prostu użyjesz $(this), ale jestem prawie pewien, że widoki Backbone są skonfigurowane tak, że thiszawsze odwołują się do widoku, więc spróbuj tego:

perpage: function(ev) {
   alert($(ev.target).text());
}

NAPRAWDĘ PÓŹNA EDYCJA : Prawdopodobnie chcesz użyć $(ev.currentTarget). Zobacz dyskusję na temat odpowiedzi Pawlika poniżej

Jamie Wong
źródło
1
Jeśli mam rację, działa to w przypadku zdarzeń jquery (o które pytał plakat). Zwróć jednak uwagę, że zdarzenia wyzwalane przez funkcję trigger () szkieletu nie zawierają tych informacji (zamiast tego podaje argumenty użyte podczas wywoływania funkcji trigger ())
Jens Alm
1
@roufamatic - ponieważ są to naprawdę standardowe zdarzenia JavaScript, więc jest to poza zakresem BackboneJS. Te dokumenty nie zawierają również odniesień do HTML ani CSS.
skalee
1
„Widoki szkieletowe są ustawione tak, aby zawsze odnosiły się do widoku” - dotyczy to tylko zdarzeń zdefiniowanych z delegateEvents([events])lub z eventsprzekazanym obiektem Backbone.View.extend(który używa poprzedniej metody w tle). Nie dotyczy to zdarzeń związanych w inicjatorze, metodzie renderowania itp.
skalee
98

ev.targetmoże wprowadzać w błąd, należy postępować ev.currentTargetzgodnie z opisem na http://www.quirksmode.org/js/events_order.html

pawlik
źródło
2
Dobrze wiedzieć - ale wygląda na to, że nie jest zaimplementowany w IE - czy też jQuery przeprowadza normalizację, aby to naprawić?
Jamie Wong,
2
Wygląda na to, że jQuery normalizuje zarówno ev.target jako element dom inicjujący zdarzenie, jak i ev.currentTarget jako bieżący element DOM w fazie propagacji zdarzenia api.jquery.com/category/events/event-object
mikermcneil
6
Właśnie się tym bawiłem i żeby wyjaśnić, prawdopodobnie chcesz ev.currentTarget. Jest znormalizowany i bezpieczny do użycia we wszystkich przeglądarkach obsługujących jQuery.
mikermcneil
4
Tak, zamiast celu chcesz użyć currentTarget. Na przykład, jeśli powiążesz łącze zawierające obiekty podrzędne, cel „<a> <span> tekst </a>” może wskazywać na <span>, a nie <a>.
Evgenii,
To powinna być odpowiedź. event.targetdostaniesz tylko to, co zostało kliknięte.
Lorem
0

Możesz uzyskać dowolny atrybut. ev działa jako this:

perpage: function(ev) {
        console.log($(ev.target).attr('name'));
}
Nvan
źródło