backbone.js - события, зная, что было нажато

96

В одном из моих классов представлений backbone.js у меня есть что-то вроде:

...

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

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

...

потому что моя разметка для каждой страницы может иметь что-то вроде:

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

Так как же мне найти информацию об элементе, вызвавшем событие? Или в данном случае это было нажато?

Мэтью
источник

Ответы:

132

Обычно при привязке события вы просто используете $(this), но я уверен, что представления Backbone настроены так, что thisвсегда ссылаются на представление, поэтому попробуйте следующее:

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

ДЕЙСТВИТЕЛЬНО ПОЗДНЕЕ РЕДАКТИРОВАНИЕ : вы, вероятно, захотите использовать $(ev.currentTarget). См. Обсуждение ответа Павлика ниже

Джейми Вонг
источник
1
Если я прав, это работает с событиями jquery (о которых спрашивал плакат). Однако обратите внимание, что события, запускаемые с помощью функции триггера () магистрали, не несут эту информацию (вместо этого она дает вам аргументы, используемые при вызове trigger ())
Йенс Альм,
1
@roufamatic - потому что это действительно стандартные события JavaScript, поэтому они выходят за рамки BackboneJS. Эти документы также не содержат ссылок на HTML и CSS.
skalee
1
«Базовые представления настроены так, что они всегда относятся к представлению» - это применимо только к событиям, определенным с delegateEvents([events])помощью eventsобъекта или с переданным объектом Backbone.View.extend(который использует предыдущий метод за кулисами). Это не относится к событиям, связанным в инициализаторе, методе рендеринга и т. Д.
skalee
98

ev.targetможет вводить в заблуждение, вы должны использовать, ev.currentTargetкак описано на http://www.quirksmode.org/js/events_order.html

павлик
источник
2
Полезно знать - но похоже, что это не реализовано в IE - или jQuery выполняет нормализацию, чтобы исправить это?
Джейми Вонг
2
Похоже, jQuery нормализует как ev.target как элемент dom, инициализирующий событие, так и ev.currentTarget как текущий элемент DOM в фазе всплытия
mikermcneil
6
Я просто играл с этим, и, чтобы уточнить, вам, вероятно, нужен ev.currentTarget. Он нормализован и безопасен для использования во всех браузерах, поддерживающих jQuery.
mikermcneil
4
Да, вы хотите использовать currentTarget вместо target. Например, если вы привязываете ссылку, содержащую дочерние объекты, цель «<a> <span> text </a>» может указывать на <span>, а не на <a>.
Евгений
Это должен быть ответ. event.targetполучить только то, что нажали.
Lorem
0

Вы можете получить любой атрибут, какой захотите. ev работает как this:

perpage: function(ev) {
        console.log($(ev.target).attr('name'));
}
Nvan
источник