看来,模糊事件会使click事件处理程序停止工作吗?我有一个组合框,其中的选项仅在文本字段具有焦点时出现。选择一个选项链接应该导致一个事件发生。
我在这里有一个小提琴的例子:http : //jsfiddle.net/uXq5p/6/
复制:
- 选择文本框
- 出现链接
- 点击链接
- 甚至发生模糊并且链接消失
- 什么都没发生。
预期行为:
在第5步中,在发生模糊之后,咔嗒声甚至也应该触发。我该如何实现?
更新:
在玩了一段时间之后,如果模糊事件使clicked元素变为Un-clickable,似乎有人已经竭尽全力防止已经发生的click事件得到处理。
例如:
$('#ShippingGroupListWrapper').css('left','-20px');
效果很好,但是
$('#ShippingGroupListWrapper').css('left','-2000px');
防止点击事件。
这似乎是在Firefox中的错误,因为让一个元素未点击应防止未来的点击,但没有取消的时候可以点击它已经发生的。
阻止click事件处理的其他原因:
$('#ShippingGroupListWrapper').css('z-index','-20');
$('#ShippingGroupListWrapper').css('display','none');
$('#ShippingGroupListWrapper').css('visibility','hidden');
$('#ShippingGroupListWrapper').css('opacity','.5');
我在这个网站上发现了其他一些类似的问题。似乎有两种解决方案:
使用延迟。这很糟糕,因为它在隐藏事件和单击事件处理程序之间创建了竞争条件。它也马虎。
使用
mousedown事件。但这也不是一个很好的解决方案,因为这click是链接的正确事件。mousedown从UX的角度来看,行为是违反直觉的,尤其是因为您不能通过在释放按钮之前将鼠标移离元素来取消单击。
我还能想到更多。
3.在链接上使用mouseover和启用/禁用字段的模糊事件。由于不涉及鼠标,因此这不适用于键盘制表键。mouseout
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元素,而不是被单击的元素。但是,也许有一种可靠的方法可以知道1.现在哪个元素具有焦点或两个焦点,哪个元素从模糊处理程序中引起了模糊(不是哪个元素正在模糊)。另外,还有其他事件(除了之外mousedown)会在模糊之前触发?