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

vik*_*iky 4 focus focusin dom-events backbone.js

我使用Backbone.js的代码视图部分是这样的:

var myView = Backbone.View.extend({

    events: {
        'focus .cell input'     : "updateCurrentCell"
    },
    updateCurrentCell: function(event) {
        console.log('updateCurrentCell called');
        // Update the current cell.
    }
}
Run Code Online (Sandbox Code Playgroud)

只要input元素获得焦点,就会调用该函数两次.我尝试使用打印堆栈跟踪console.trace().它显示一旦函数调用源自焦点事件而下一次从焦点开始.

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

sat*_*run 6

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

jquery文档中有一个关于.focus()的注释,它可能是相关的:

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

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