Backbone.js焦点事件触发两个事件焦点和焦点

时间:2011-08-10 08:22:57

标签: focus backbone.js dom-events 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()打印堆栈跟踪。它显示一旦函数调用来自焦点事件,而下一次来自 focusin

我试图找出如何防止其中一个事件被解雇导致我无处可去。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

Backbone.View使用delegateEvents绑定事件对象中列出的事件。如果您查看source,则会发现delegateEvents使用jQuery.delegate来执行此操作。

.focus()的jquery文档中有一条可能与之相关的注释:

  

焦点事件不会在Internet Explorer中冒泡。因此,   依赖于焦点事件的事件委托的脚本将会   不能跨浏览器一致地工作。但是,从版本1.4.2开始,   jQuery 通过将焦点映射到focusin 来解决此限制   事件委托方法中的事件,.live()和 .delegate()

从理论上讲,这应该可以正常工作,但既然你得到了两者,也许你可以尝试只听取.focusin()事件,因为它支持事件冒泡{{3} }倾听并且jQuery正试图映射'焦点'无论如何。