Событие focus в Backbone.js запускает два события focus и focusin - PullRequest
4 голосов
/ 10 августа 2011

Часть представления моего кода с использованием 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().Это показывает, что как только вызов функции произошел из события focus , а в следующий раз из focusin .

Мои попытки выяснить, как предотвратить запуск одного из этих событийведи меня в никуда.Как я могу это исправить?

1 Ответ

6 голосов
/ 10 августа 2011

Backbone.View использует DelegateEvents , чтобы связать события, перечисленные в вашем объекте событий.Если вы посмотрите на источник , вы увидите, что delegateEvents использует jQuery.delegate для этого.

В документации jquery есть примечаниедля .focus () это, вероятно, имеет значение:

Событие фокуса не всплывает в Internet Explorer.Поэтому сценарии, которые полагаются на делегирование события с событием focus, не будут работать согласованно в разных браузерах.Однако в версии 1.4.2 jQuery обходит это ограничение, сопоставляя фокус с событием focusin в его методах делегирования событий, .live () и .delegate () .

Теоретически это должно работать нормально, но, поскольку вы получаете и то и другое, возможно, вы могли бы просто попытаться прослушать событие .focusin () , поскольку оно поддерживаеттип всплывающих событий .delegate () слушает и именно это jQuery пытается сопоставить 'фокусу' в любом случае.

...