Backbone.js聚焦事件会触发两个事件focus和focusin。

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事件。
我尝试找出如何防止其中一个事件被触发,但没有任何进展。我应该怎么解决这个问题?
1个回答

7
Backbone.View使用delegateEvents来绑定在事件对象中列出的事件。如果您查看源代码, 您会发现delegateEvents使用jQuery.delegate来完成此操作。
jQuery文档中.focus()的注释可能是相关的:

在Internet Explorer中,焦点事件不会冒泡。因此,依赖于焦点事件的事件委托脚本将无法在各个浏览器中正常工作。但是,从1.4.2版本开始,jQuery通过将焦点映射到其事件委托方法.live().delegate()中的focusin事件解决了这个限制问题。

理论上来说,这应该可以正常工作,但由于你同时获取了两个事件,也许你可以尝试仅监听.focusin()事件,因为它支持.delegate()监听的事件冒泡,并且这也是jQuery正在尝试将'focus'映射到的事件。

是的,我已经看过focus()的jQuery文档了。我怀疑这可能是Backbone的问题,而不是jQuery。focusin是所有浏览器都支持的标准事件吗? - viky
我进行了快速搜索,没有发现任何暗示表明它不是。更重要的是,jQuery的目的是跨浏览器支持,如果它将焦点映射到focusin,我不见得有什么不使用它的理由。 - satchmorun
1
focusin在Firefox中不受支持,请参见: - terrinecold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接