似乎失焦事件会阻止点击事件处理程序的工作?我有一个组合框,选项只在文本字段获得焦点时才会出现。选择一个选项链接应该导致事件发生。
我在这里提供了一个示例:http://jsfiddle.net/uXq5p/6/
复现步骤:
- 选择文本框
- 链接出现
- 单击链接
- 触发失焦事件,链接消失
- 没有其他反应。
期望行为:
在第5步完成后,失焦事件发生后,点击事件也应该触发。如何实现这一点?
更新:
经过一段时间的尝试,似乎有人极力防止失焦事件使被点击的元素无法再次点击。
例如:
$('#ShippingGroupListWrapper').css('left','-20px');
功能正常,但是
$('#ShippingGroupListWrapper').css('left','-2000px');
防止点击事件发生。
这似乎是Firefox的一个错误,因为使元素无法被点击应该可以防止未来的点击事件,但不应该取消已经发生的点击事件。
其他阻止处理点击事件的事情:
$('#ShippingGroupListWrapper').css('z-index','-20');
$('#ShippingGroupListWrapper').css('display','none');
$('#ShippingGroupListWrapper').css('visibility','hidden');
$('#ShippingGroupListWrapper').css('opacity','.5');
我在这个网站上找到了几个类似的问题。似乎有两种解决方案:
使用延迟。这种方法不好,因为它会在隐藏和单击事件处理程序之间创建竞态条件。而且这样做很草率。
使用
mousedown
事件。但这也不是一个很好的解决方案,因为对于链接来说,click
才是正确的事件。从用户体验角度来看,mousedown
的行为是反直觉的,特别是在释放按钮之前无法通过将鼠标移动到元素外部来取消单击。
我能想出几个更多的解决方案。
3.在链接上使用 mouseover
和 mouseout
来启用/禁用字段的模糊事件。这种方法无法与键盘 tab 键一起使用,因为鼠标没有参与其中。
4.最好的解决方案应该是:
$('#ShippingGroup').blur(function()
{
if($(document.activeElement) == $('.ShippingGroupLinkList'))
return; // The element that now has focus is a link, do nothing
$('#ShippingGroupListWrapper').css('display','none'); // hide it.
}
不幸的是,$(document.activeElement)
似乎总是返回 body 元素,而不是被点击的元素。但也许有一个可靠的方法可以知道当前具有焦点的元素或者哪个元素导致了模糊(不是模糊的元素)从模糊处理程序内部。此外,除了 mousedown
事件之外,还有其他事件会在模糊事件之前触发吗?