backbone.js - eventos, sabendo o que foi clicado

96

Em uma das minhas classes de visualização backbone.js, tenho 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 minha marcação por página pode ter algo como:

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

Então, como exatamente posso encontrar informações sobre o elemento que causou o evento? Ou, neste caso, foi clicado?

Mateus
fonte

Respostas:

132

Normalmente, em uma associação de evento, você apenas usaria $(this), mas tenho quase certeza de que as visualizações do Backbone estão configuradas para que thissempre se refiram à visualização, então tente isto:

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

EDITAR REALMENTE TARDE : Você provavelmente deseja usar $(ev.currentTarget). Veja a discussão sobre a resposta de pawlik abaixo

Jamie Wong
fonte
1
Se eu estiver correto, isso funciona com eventos jquery (aquele sobre o qual o pôster perguntou). Observe, no entanto, que os eventos disparados pela função trigger () do backbone não carregam essas informações (em vez disso, ela fornece os argumentos usados ​​ao chamar trigger ())
Jens Alm
1
@roufamatic - porque esses são realmente eventos JavaScript padrão, portanto, estão fora do escopo do BackboneJS. Esses documentos não incluem referências de HTML nem CSS também.
Skalee
1
"As visualizações do backbone são configuradas de forma que sempre se refiram à visualização" - isso se aplica apenas a eventos definidos com delegateEvents([events])ou com o eventsobjeto passado Backbone.View.extend(que usa o método anterior nos bastidores). Isso não se aplica a eventos vinculados ao inicializador, método de renderização etc.
skalee
98

ev.targetpode ser enganoso, você deve usar ev.currentTargetconforme descrito em http://www.quirksmode.org/js/events_order.html

Pawlik
fonte
2
É bom saber - mas parece que não está implementado no IE - ou o jQuery normaliza para corrigir isso?
Jamie Wong,
2
Parece que o jQuery normaliza ev.target como o elemento dom inicializando o evento e ev.currentTarget como o elemento DOM atual na fase de bolha do evento api.jquery.com/category/events/event-object
mikermcneil
6
Eu estava brincando com isso e, para esclarecer, você provavelmente quer ev.currentTarget. Ele é normalizado e seguro para uso em todos os navegadores compatíveis com jQuery.
mikermcneil de
4
Sim, você deseja usar currentTarget em vez de target. Por exemplo, se você vincular um link que contém objetos filho "<a> <span> texto </a>", o destino pode apontar para <span> e não para <a>.
Evgenii
Esta deve ser a resposta. event.targetsó obtém o que foi clicado.
Lorem
0

Você pode obter qualquer atributo que desejar. ev funciona como this:

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