我正在制作一个小部件,可以使用showTracker
和hideTracker
函数在hover
上滑入滑出。但是,如果它包含一个聚焦的表单元素,我想防止它滑出视图,所以我已经这样做了:
function hideTracker(){
if($('#tracker').find(':focus').length == 0){
$('#tracker').stop().hide();
}
}
凉爽的。现在,如果鼠标碰巧向外移动,如果有一个字段处于焦点中,它就不会隐藏起来。不幸的是,这也意味着当字段失去焦点时(现在是小部件再次隐藏的时候了),它只是停留在那里。unHover事件已经过去了又过去了。
因此,我添加了以下内容:
$('#tracker *').blur(function(){
hideTracker();
});
这也行得通--只有一个我需要帮助的小bug!
如果焦点从跟踪器中的一个元素移动到也在#tracker
中的另一个元素,跟踪器将隐藏。我认为if($('#tracker').find(':focus').length == 0)
会返回false,因为下一个表单元素有焦点,但我猜它没有。
是否会在下一个元素获得焦点之前触发.blur()?
我怎么才能避免这个问题呢?
发布于 2011-03-23 09:06:54
感谢你们所有人的回答。使用.focus()事件而不是.blur()是一种看待它的聪明方法。不幸的是,它确实带来了一些浏览器问题,并且我无法让上面的任何一个都很好地工作。
最后,我决定使用setTimeout(hideTracker, 100);
来允许focus()事件在tracker内的聚焦元素计数被计算之前发生。不是很理想,但它工作得很好,并且延迟相当难以察觉。
再次感谢。
发布于 2011-03-21 12:46:04
像这样怎么样?
$('body *').focus(function(){
if(!$(this).is('#tracker *') && $('#tracker:visible').length != 0) hideTracker();
});
发布于 2011-03-21 13:38:39
啊呀。很棘手。是的,正在发生的事情是:
mousedown
:旧表单元素获取blur
事件。$(':focus').length == 0
.mouseup
:新表单元素获取focus
事件。$newFormElement.is(':focus') == true
.这是一个改进:
$('#tracker').focusout(function() //basically like $('#tracker, #tracker *').blur(), but "this" is always '#tracker'
{
if(!$(this).is('#tracker:hover')) //for some reason plain old :hover doesn't work, at least on the latest OS X Chrome
hideTracker();
});
但这并不完美。只有当你使用鼠标时,它才能真正起作用。如果在鼠标未悬停在#tracker
上时使用Tab键在字段之间移动(或其他一些可能的机制),它将不起作用。
这是另一个尝试。这是个bit...hackier。要点是,不是处理blur
事件,而是处理第二个被关注的事件的focus
事件。但!如果你点击了一些不能被聚焦的东西怎么办?页面上有空格吗?则不会触发任何focus
事件。
好吧。所以诀窍是:在根<html>
标记中放置一个tabindex="0"
。这意味着总有一些东西是可以聚焦的。所以没有办法专注于任何事情(至少,我不这么认为)。
然后你可以这样做:
$('*').live('focus', function(e)
{
if(!$.contains($('#tracker')[0], this)) //if the new thing you focused on is not a descendant of #tracker
hideTracker();
e.stopPropagation();
});
嗯?所以是的,这是一个经过认证的黑客。但这是一个棘手的问题,这是我目前能想到的最好的办法。
https://stackoverflow.com/questions/5373854
复制相似问题