Событие 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 пытается сопоставить "фокус" в любом случае.

Другие вопросы по тегам