我有一个程序,其中有 jQuery UI 对话框。我希望这些对话框在失去焦点时关闭,例如用户单击相关对话框之外的任何位置。
从表面上看,这似乎是一个简单的问题,但blur
事件根本不起作用。之后我转到focusin
and focusout
,但偶然发现了一个奇怪的问题:
当我有一个对话框并附加到包含对话框focusin
的focusout
元素(我调用的元素的父级dialog
)时。对话框出现后的第一次点击总是会产生一个focusout
事件,无论点击在哪里。
因此,如果我想在 上销毁对话框focusout
,则对话框会在不应该被销毁的时候被销毁。这是jsFiddle演示了我的问题。
我知道我可以使用一些技巧来忽略第一个focusout
,但我想知道是否有任何方法可以让它以正确的方式工作,即当用户在对话框外部单击第一个时会产生唯一的事件时间。
更新:
在以下帮助下,我找到了对我的问题的满意答案underscore.js
:
我把我的问题分解成几个部分:
- A
focusout
在第一次点击时发生 - 如果点击在对话框之外,则没有进一步的事件
- 如果单击是在对话框内,则发生
focusin
事件
因此,当有一系列focusout
->时,就会发生不良行为focusin
。我使用下划线defer
函数和布尔修饰符来解决这个问题
onFocusout: function(event) {
console.log('focus out');
this.hasFocus = false;
var self = this;
_.defer(function() {
if (!self.hasFocus) alert('DESTROY DIALOG');
});
},
onFocusin: function() {
console.log('focus in');
this.hasFocus = true;
},
defer
使函数等待直到调用堆栈被清除(在不良行为情况下,focusin
堆栈中有一个事件等待)然后执行它。因此,如果在变量更改为onFocusin
之后立即触发,并且延迟函数不会破坏对话框!onFocusout
hasFocus
true
谢谢您的回答!