4

我使用 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

我试图找出如何防止其中一个事件被解雇,但结果却一无所获。我怎样才能解决这个问题?

4

1 回答 1

7

Backbone.View 使用delegateEvents绑定事件对象中列出的事件。如果您查看源代码,您会看到它delegateEvents使用jQuery.delegate来执行此操作。

jquery docs for .focus()中有一条可能相关的注释:

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

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

于 2011-08-10T17:14:44.620 回答