好吧,我在我的下拉控制中遇到同样的问题。我向Chrome开发者询问了这个问题,他们说这是a bug,由于“这个问题还没有被很多人报告,修复也不是微不足道的”,因此这个问题在最近的将来不会被修复。所以,让我们面对事实:这个错误至少会持续一年。
虽然,对于这种特殊情况(下拉)有一个解决方法。诀窍是:当点击一个滚动条时,“鼠标向下”事件进入该滚动条的所有者元素。我们可以使用这个事实来设置一个标志并在“onblur”处理程序中检查它。这里的解释:
<input id="search_ctrl">
<div id="dropdown_wrap" style="overflow:auto;max-height:30px">
<div id="dropdown_rows">
<span>row 1</span>
<span>row 2</span>
<span>row 2</span>
</div>
</div>
“dropdown_wrap”div会得到一个垂直滚动条,因为它的内容不符合固定高度。一旦我们获得点击,我们确信滚动条被点击并且焦点将被取消。现在一些代码如何处理:
search_ctrl.onfocus = function() {
search_has_focus = true
}
search_ctrl.onblur = function() {
search_has_focus = false
if (!keep_focus) {
// hide dropdown
} else {
keep_focus = false;
search_ctrl.focus();
}
}
dropdow_wrap.onclick = function() {
if (isChrome()) {
keep_focus = search_has_focus;
}
}
就是这样。我们不需要对FF进行任何攻击,因此对浏览器进行检查。在Chrome中,我们检测到单击滚动条,允许模糊焦点而不关闭列表,然后立即将焦点恢复到输入控件。当然,如果我们有一些关于“search_ctrl.onfocus”的逻辑,它也应该被修改。请注意,我们需要检查search_ctrl是否具有焦点以防止双击出现问题。
您可能猜测更好的想法可能会取消onblur事件,但这在Chrome中不起作用。不知道这是错误还是功能。
P.S. “dropdown_wrap”不应该有任何填充或边框,否则用户可以点击这个区域,我们将把它作为一个滚动条点击。
我做了同样的事情,但将它应用于'focusout'事件。 – elmt 2012-07-23 20:29:50