2011-03-21 34 views
2

我正在使用showTrackerhideTracker函数在hover上滑入和滑出视图。我想阻止它滑出视图,如果它包含一个焦点形式元素,所以我有这个去:jQuery find(':focus')未按预期行事

function hideTracker(){ 
    if($('#tracker').find(':focus').length == 0){ 
    $('#tracker').stop().hide();  
    } 
} 

很酷。现在它不隐藏,如果鼠标碰巧移动了,如果有焦点的话。不幸的是,这也意味着当该领域失去焦点时(现在是小部件再次隐藏的时候),它只是停留在那里。 unHover事件已经消失。

所以我加了这一点:

$('#tracker *').blur(function(){ 
    hideTracker(); 
}); 

这工程太 - 与一个小错误,我需要帮助!

如果焦点从跟踪器中的一个元素移动到另一个也在#tracker内的元素,则跟踪器将隐藏。我认为if($('#tracker').find(':focus').length == 0)将返回false,因为下一个表单元素有焦点,但我想它不会。

在下一个元素获得焦点之前,.blur()会触发吗?

我怎样才能解决这个问题?

+0

为什么不只是将模糊添加到您的跟踪器div?你只想隐藏它,如果你从它的领域失去焦点,是吗? – corroded 2011-03-21 05:05:53

+0

据我所知,当焦点离开其子输入时,模糊事件不会在div上触发。 – doctororange 2011-03-21 05:17:59

+0

啊,我现在记得。无论如何,你也可以尝试检查你的输入是否在#tracker中。如果($(this).parents(“#tracker”).length)不隐藏,否则隐藏 – corroded 2011-03-21 05:24:18

回答

0

谢谢大家的回答。使用.focus()事件而不是.blur()是查看它的一个聪明方法。不幸的是,它确实会引发一些浏览器问题,并且我无法很好地实现上述任何一种工作。

最后我决定使用setTimeout(hideTracker, 100);来允许焦点()事件发生在跟踪器内的焦点元素的计数被评估之前。不理想,但它运行良好,延迟相当难以察觉。

再次感谢。

1

这样的事情呢?

$('body *').focus(function(){ 
    if(!$(this).is('#tracker *') && $('#tracker:visible').length != 0) hideTracker(); 
}); 
1

Y。棘手。是的,发生了什么事是:

  1. mousedown:旧的表单元素获取blur事件。 $(':focus').length == 0
  2. 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之上时使用选项卡在字段之间移动(或其他可能的机制),它将不起作用。


这是另一个尝试。这有点... 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(); 
}); 

嗯?所以,是的,这是一个认证的黑客。但这是一个棘手的问题,这是我在这个时候能够提出的最好的。