backbone.js - événements, savoir ce qui a été cliqué

96

Dans l'une de mes classes de vue backbone.js, j'ai quelque chose comme:

...

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

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

...

car mon balisage par page peut avoir quelque chose comme:

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

Alors, comment puis-je trouver exactement des informations sur l'élément qui a causé l'événement? Ou dans ce cas, qui a été cliqué?

Matthieu
la source

Réponses:

132

Normalement, sur une liaison d'événement, vous utiliseriez simplement $(this), mais je suis assez sûr que les vues Backbone sont configurées de manière à thistoujours faire référence à la vue, alors essayez ceci:

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

MODIFICATION VRAIMENT TARDIVE : Vous souhaitez probablement utiliser $(ev.currentTarget). Voir la discussion sur la réponse de pawlik ci-dessous

Jamie Wong
la source
1
Si j'ai raison, cela fonctionne avec les événements jquery (ceux sur lesquels l'affiche a posé des questions). Notez cependant que les événements déclenchés par la fonction trigger () de backbone ne portent pas cette information (il vous donne à la place les arguments utilisés lors de l'appel de trigger ())
Jens Alm
1
@roufamatic - parce que ce sont vraiment des événements JavaScript standard, donc cela sort du cadre de BackboneJS. Ces documents n'incluent pas non plus de référence HTML ni CSS.
skalee
1
«Les vues dorsales sont configurées de sorte que cela se réfère toujours à la vue» - ceci s'applique uniquement aux événements définis avec delegateEvents([events])ou avec un eventsobjet passé à Backbone.View.extend(qui utilise l'ancienne méthode en arrière-plan). Cela ne s'applique pas aux événements liés dans l'initialiseur, la méthode de rendu, etc.
skalee
98

ev.targetpeut être trompeur, vous devez utiliser ev.currentTargetcomme décrit sur http://www.quirksmode.org/js/events_order.html

pawlik
la source
2
Bon à savoir - mais il semble que ce ne soit pas implémenté dans IE - ou jQuery fait-il une normalisation pour résoudre ce problème?
Jamie Wong
2
On dirait que jQuery normalise à la fois ev.target en tant qu'élément dom initialisant l'événement et ev.currentTarget en tant qu'élément DOM actuel dans la phase d'événement bouillonnant api.jquery.com/category/events/event-object
mikermcneil
6
Je jouais juste avec ça, et pour clarifier, vous voulez probablement ev.currentTarget. Il est normalisé et sûr pour une utilisation dans tous les navigateurs pris en charge par jQuery.
mikermcneil
4
Oui, vous souhaitez utiliser currentTarget au lieu de target. Par exemple, si vous liez un lien contenant des objets enfants, la cible "<a> <span> texte </a>" peut pointer vers <span> et non vers <a>.
Evgenii
Cela devrait être la réponse. event.targetvous obtenez seulement ce qui est cliqué.
Lorem
0

Vous pouvez obtenir n'importe quel attribut que vous souhaitez. ev fonctionne comme this:

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