Событие focus в Backbone.js запускает два события focus и focusin
Часть представления моего кода с использованием Backbone.js выглядит примерно так:
var myView = Backbone.View.extend({
events: {
'focus .cell input' : "updateCurrentCell"
},
updateCurrentCell: function(event) {
console.log('updateCurrentCell called');
// Update the current cell.
}
}
Всякий раз, когда элемент ввода получает фокус, функция вызывается дважды. Я попытался распечатать трассировку стека, используя console.trace()
, Это показывает, что однажды вызов функции произошел из события фокуса, а в следующий раз из фокуса.
Мои попытки выяснить, как предотвратить запуск одного из этих событий, ни к чему не привели. Как я могу это исправить?
1 ответ
Backbone.View использует DelegateEvents для привязки событий, перечисленных в вашем объекте событий. Если вы посмотрите на источник, вы увидите, что delegateEvents
использует для этого http://api.jquery.com/delegate/.
В документации jquery есть примечание для .focus(), которое, вероятно, имеет значение:
Событие фокуса не всплывает в Internet Explorer. Поэтому сценарии, которые полагаются на делегирование события с событием focus, не будут работать согласованно в разных браузерах. Однако, начиная с версии 1.4.2, jQuery обходит это ограничение, сопоставляя фокус с событием focusin в своих методах делегирования событий, .live() и .delegate().
Теоретически, это должно работать нормально, но, поскольку вы получаете и то и другое, возможно, вы могли бы просто попытаться прослушать событие .focusin(), поскольку оно поддерживает тот тип события, которое прослушивает .delegate(), и именно это jQuery пытается сопоставить "фокус" в любом случае.