backbone.js: eventos, saber en qué se hizo clic

96

En una de mis clases de vista backbone.js, tengo algo como:

...

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

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

...

porque mi marcado por página podría tener algo como:

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

Entonces, ¿cómo puedo encontrar exactamente información sobre el elemento que causó el evento? ¿O en este caso, se hizo clic?

Mateo
fuente

Respuestas:

132

Normalmente, en un enlace de evento, solo usaría $(this), pero estoy bastante seguro de que las vistas de Backbone están configuradas para que thissiempre se refieran a la vista, así que intente esto:

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

REALMENTE TARDE EDITAR : Probablemente quieras usar $(ev.currentTarget). Vea la discusión sobre la respuesta de pawlik a continuación

Jamie Wong
fuente
1
Si estoy en lo cierto, esto funciona con eventos de jquery (el que preguntó el póster). Sin embargo, tenga en cuenta que los eventos activados a través de la función trigger () de la red troncal no contienen esta información (en su lugar, le proporciona los argumentos utilizados al llamar a trigger ())
Jens Alm
1
@roufamatic: porque esos son eventos JavaScript realmente estándar, por lo que está fuera del alcance de BackboneJS. Esos documentos no incluyen referencias de HTML ni CSS tampoco.
skalee
1
"Las vistas de la red troncal están configuradas para que siempre se refieran a la vista"; esto se aplica solo a los eventos definidos con delegateEvents([events])o con el eventsobjeto pasado Backbone.View.extend(que utiliza el método anterior entre bastidores). Esto no se aplica a los eventos vinculados al inicializador, al método de renderizado, etc.
skalee
98

ev.targetpuede ser engañoso, debe usarlo ev.currentTargetcomo se describe en http://www.quirksmode.org/js/events_order.html

pawlik
fuente
2
Es bueno saberlo, pero parece que no está implementado en IE, ¿o jQuery realiza una normalización para solucionar esto?
Jamie Wong
2
Parece que jQuery normaliza ev.target como el elemento dom que inicializa el evento y ev.currentTarget como el elemento DOM actual dentro de la fase de propagación
mikermcneil
6
Estaba jugando con esto, y para aclarar, probablemente quieras ev.currentTarget. Está normalizado y es seguro para su uso en todos los navegadores compatibles con jQuery.
mikermcneil
4
Sí, desea utilizar currentTarget en lugar de target. Por ejemplo, si enlaza un vínculo que contiene objetos secundarios, "<a> <span> texto </a>", el destino puede apuntar a <span> y no a <a>.
Evgenii
Esta debería ser la respuesta. event.targetsolo obtén lo que se hace clic.
Lorem
0

Puede obtener cualquier atributo que desee. ev funciona como this:

perpage: function(ev) {
        console.log($(ev.target).attr('name'));
}
Nvan
fuente