我有了一个链接列表,它可以打开和关闭小部件:当使用模糊与超时实现点击外关闭 - 时间间隔有时太短
<div class="widget">
<input class="focuser">
<a href="javascript:;">View options</a>
<ul>
<li>Option 1</li>
<li>Option 1</li>
</ul>
</div>
所以,当我点击View options
- 列表出现,当点击任何选项 - 做东西并关闭选项列表。
而且我需要有click-outside-close
功能 - 当用户在关闭列表之外的任何地方单击时。
我通过在显示选项时关注一个不可见的输入以及在输入的blur
上实现了这一点 - 在某些超时后隐藏选项。这样:
- 当用户在外面点击 - 模糊超时用完 - 隐藏选项。
- 如果用户点击任何选项 - 清除超时,隐藏选项&做 的东西。
现在的问题是,有时超时会在点击之前结束。我将超时间隔增加到了200毫秒,但它仍然不是100%确定的,而且 - 用户在关闭选项列表之前看到延迟。
任何想法如何解决和/或改善?
编辑:JavaScript代码的
这是简化版本:
CartSidebar.DwCustomSelect = Ember.View.extend({
blurTimeout: false,
focusOut: function(e) {
if (e.target.className == 'focuser') {
var self = this;
this.blurTimeout = setTimeout(function() {
clearTimeout(self.blurTimeout);
$(self.element).removeClass('opened'); // hide options ..
}, 180);
}
},
click: function(e) {
var clickedElement = e.target;
clearTimeout(this.blurTimeout);
if (clickedElement.tagName.toLowerCase() == 'li') {
$(this.element).removeClass('opened'); // hide options ..
doStuff();
}
}
}
编辑2:
我创建了一个plunker,这样你就可以在行动中看到它:
https://plnkr.co/edit/boA6yC0sEbLAZU9tjyso?p=preview
(我的超时时间太短,所以你看到了问题。但即使增加间隔 - 您将看到focusOut
在click
之前触发。)
的jsbin为什么你需要超时?为什么不在列表之外单击后立即隐藏列表? –
就像@MattSpinks说的,摆脱'setTimeout'。如果你坚持使用'setTimeout'来延迟,那么发布你的代码来看看问题在哪里。 –
因为在这种情况下,您点击选项 - 序列将是“输入模糊” - “隐藏选项” - “点击” - 但选项不会在那里,所以点击触发选项下方的元素。 –