backbone.js - eventi, sapere cosa è stato cliccato


96

In una delle mie classi di visualizzazione backbone.js, ho qualcosa del tipo:

...

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

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

...

perché il mio markup per pagina potrebbe avere qualcosa del tipo:

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

Quindi, come posso trovare esattamente le informazioni sull'elemento che ha causato l'evento? O in questo caso, è stato cliccato?

Risposte:


132

Normalmente su un evento bind, dovresti semplicemente usare $(this), ma sono abbastanza sicuro che le viste Backbone siano impostate in modo che thissi riferiscano sempre alla vista, quindi prova questo:

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

MODIFICA DAVVERO TARDIVA : Probabilmente vorrai usare $(ev.currentTarget). Vedi la discussione sulla risposta di pawlik di seguito


1
Se ho ragione, funziona con gli eventi jquery (quelli di cui il poster ha chiesto informazioni). Si noti tuttavia che gli eventi attivati ​​tramite la funzione trigger () di backbone non trasportano queste informazioni (invece fornisce gli argomenti utilizzati quando si chiama trigger ())
Jens Alm

1
@roufamatic - perché quelli sono eventi JavaScript standard, quindi non rientrano nell'ambito di BackboneJS. Questi documenti non includono riferimenti a HTML né CSS.
skalee

1
"Le viste backbone sono impostate in modo che faccia sempre riferimento alla vista" - questo si applica solo agli eventi definiti con delegateEvents([events])o con eventsoggetto passato a Backbone.View.extend(che utilizza il metodo precedente dietro le quinte). Questo non si applica agli eventi associati all'inizializzatore, al metodo di rendering ecc.
skalee

98

ev.targetpuò essere fuorviante, dovresti usare ev.currentTargetcome descritto su http://www.quirksmode.org/js/events_order.html


2
Buono a sapersi - ma sembra che non sia implementato in IE - o jQuery esegue la normalizzazione per risolvere questo problema?
Jamie Wong

2
Sembra che jQuery normalizzi sia ev.target come elemento dom che inizializza l'evento sia ev.currentTarget come elemento DOM corrente all'interno della fase di bubbling dell'evento api.jquery.com/category/events/event-object
mikermcneil

6
Stavo solo giocando con questo, e per chiarire, probabilmente vuoi ev.currentTarget. È normalizzato e sicuro per l'uso in tutti i browser supportati da jQuery.
mikermcneil

4
Sì, vuoi usare currentTarget invece di target. Ad esempio, se colleghi un collegamento che contiene oggetti secondari "<a> <span> testo </a>", il target può puntare a <span> e non a <a>.
Evgenii

Questa dovrebbe essere la risposta. event.targetottieni solo ciò che viene cliccato.
Lorem

0

Puoi ottenere qualsiasi attributo desideri. ev funziona come this:

perpage: function(ev) {
        console.log($(ev.target).attr('name'));
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.