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.