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'));
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.