首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >焦点find(‘:jQuery’)未按预期运行

焦点find(‘:jQuery’)未按预期运行
EN

Stack Overflow用户
提问于 2011-03-21 12:39:01
回答 3查看 769关注 0票数 2

我正在制作一个小部件,可以使用showTrackerhideTracker函数在hover上滑入滑出。但是,如果它包含一个聚焦的表单元素,我想防止它滑出视图,所以我已经这样做了:

代码语言:javascript
运行
复制
function hideTracker(){
  if($('#tracker').find(':focus').length == 0){ 
    $('#tracker').stop().hide();    
  }
}

凉爽的。现在,如果鼠标碰巧向外移动,如果有一个字段处于焦点中,它就不会隐藏起来。不幸的是,这也意味着当字段失去焦点时(现在是小部件再次隐藏的时候了),它只是停留在那里。unHover事件已经过去了又过去了。

因此,我添加了以下内容:

代码语言:javascript
运行
复制
$('#tracker *').blur(function(){
  hideTracker();
}); 

这也行得通--只有一个我需要帮助的小bug!

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

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

我怎么才能避免这个问题呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-23 09:06:54

感谢你们所有人的回答。使用.focus()事件而不是.blur()是一种看待它的聪明方法。不幸的是,它确实带来了一些浏览器问题,并且我无法让上面的任何一个都很好地工作。

最后,我决定使用setTimeout(hideTracker, 100);来允许focus()事件在tracker内的聚焦元素计数被计算之前发生。不是很理想,但它工作得很好,并且延迟相当难以察觉。

再次感谢。

票数 0
EN

Stack Overflow用户

发布于 2011-03-21 12:46:04

像这样怎么样?

代码语言:javascript
运行
复制
$('body *').focus(function(){
    if(!$(this).is('#tracker *') && $('#tracker:visible').length != 0) hideTracker();
});
票数 1
EN

Stack Overflow用户

发布于 2011-03-21 13:38:39

啊呀。很棘手。是的,正在发生的事情是:

  1. mousedown:旧表单元素获取blur事件。$(':focus').length == 0.
  2. mouseup:新表单元素获取focus事件。$newFormElement.is(':focus') == true.

这是一个改进:

代码语言:javascript
运行
复制
$('#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"。这意味着总有一些东西是可以聚焦的。所以没有办法专注于任何事情(至少,我不这么认为)。

然后你可以这样做:

代码语言:javascript
运行
复制
$('*').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();
});

嗯?所以是的,这是一个经过认证的黑客。但这是一个棘手的问题,这是我目前能想到的最好的办法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5373854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档