我正在编写一个基本上具有以下功能的建议组件:
我试图像这样编写我的组件的focusOut事件:
focusOut: function(event, view){
if (!$.contains(this.$('.autocomplete-group')[0], event.relatedTarget))
this.set('showingSuggestions', false)
}
基本上它会看到新的焦点项(event.relatedTarget)是否在我的组件的外部DIV内(具有autocomplete-group类)。
这适用于Chrome,但不适用于Firefox或IE。事实证明,FF没有填充relatedTarget属性。
然后我尝试了一个没有开心的解决方案(引用here)。它并没有让我高兴,因为将事件挂钩到整个文档似乎并不合适。无论如何它也不起作用。
我的问题是,是否有一种简单的,简单的跨浏览器方式来简单地检测焦点是否超出了我的整个组件。
答案 0 :(得分:7)
使用Em.run.later
在新的runloop中运行代码。这是我的一个插件的代码示例。当焦点离开组件时,我隐藏了一个下拉菜单。
lostFocus: function() {
if(this.get('isOpen')) {
Em.run.later(this, function() {
var focussedElement = document.activeElement;
var isFocussedOut = this.$().has(focussedElement).length === 0
&& !this.$().is(focussedElement);
if(isFocussedOut) {
this.closeOptions({focus:false});
}
}, 0);
}
}.on('focusOut'),
在单独的runloop中运行代码将确保您正确获取document.activeElement