Javascript jQuery find(';:焦点';)未按预期运行
我正在制作一个小部件,它通过Javascript jQuery find(';:焦点';)未按预期运行,javascript,jquery,focus,onblur,Javascript,Jquery,Focus,Onblur,我正在制作一个小部件,它通过showTracker和hideTracker功能在hover上滑入滑出视图。如果它包含聚焦的表单元素,我想防止它滑出视图,所以我做了以下工作: function hideTracker(){ if($('#tracker').find(':focus').length == 0){ $('#tracker').stop().hide(); } } 酷。现在,如果有焦点区域,鼠标恰好移出,它不会隐藏。不幸的是,这也意味着当字段确实失去焦点时
showTracker
和hideTracker
功能在hover
上滑入滑出视图。如果它包含聚焦的表单元素,我想防止它滑出视图,所以我做了以下工作:
function hideTracker(){
if($('#tracker').find(':focus').length == 0){
$('#tracker').stop().hide();
}
}
酷。现在,如果有焦点区域,鼠标恰好移出,它不会隐藏。不幸的是,这也意味着当字段确实失去焦点时(小部件再次隐藏的时间到了),它只是停留在那里。未结束的事件已经过去了
所以我补充说:
$('#tracker *').blur(function(){
hideTracker();
});
这也行得通——有一个小虫子我需要帮助
如果焦点从跟踪器中的一个元素移动到另一个元素(也在跟踪器中),跟踪器将隐藏。我估计,if($(“#tracker”).find(“:focus”).length==0)
将返回false,因为下一个表单元素有focus,但我猜它没有
是不是.blur()在下一个元素获得焦点之前触发
我怎样才能避开这件事呢?像这样的事情怎么样
$('body *').focus(function(){
if(!$(this).is('#tracker *') && $('#tracker:visible').length != 0) hideTracker();
});
哎呀。棘手的是的,正在发生的是:
mousedown
:旧表单元素获取blur
事件<代码>$(':focus')。长度==0mouseup
:新表单元素获取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();
});
但这并不完美。只有当你使用鼠标时,它才真正起作用。如果在鼠标未悬停在“跟踪器”上时,使用tab键在字段(或其他可能的机制)之间移动,它将无法工作
这是另一个尝试。有点…更黑。要点是,不是处理
blur
事件,而是处理第二个被聚焦的事物的focus
事件。但是如果你点击了无法聚焦的东西怎么办?你的页面上有空白吗?然后不会触发focus
事件
好的。所以诀窍是:在根
标记中放置一个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();
});
嗯??是的,这是一个经过认证的黑客。但这是一个棘手的问题,这是我目前能想到的最好的答案。谢谢大家的回答。使用.focus()事件而不是.blur()是一种聪明的方法。不幸的是,它确实引发了一些浏览器问题,而且我无法让上面的任何一个都很好地工作 最后,我决定使用
setTimeout(hideTracker,100)代码>允许focus()事件在计算跟踪器中聚焦元素的计数之前发生。不太理想,但它工作得很好,延迟是相当难以察觉的
再次感谢。为什么不将模糊添加到您的跟踪器div中?你只想隐藏它,如果你从它的字段失去焦点,艾尔特?据我所知,当焦点离开它的一个子输入时,模糊事件不会在div上触发。啊,是的,我现在记得了。无论如何,您也可以尝试检查您的输入是否在#tracker中。如果($(this).parents(“#tracker”).length)不隐藏,否则,现在隐藏,我发现添加一个再次显示它的.focus()事件(并在show和hide上使用.stop(true,false)可以正常工作,但是添加额外的钩子来撤销错误的调用并不像一开始就阻止隐藏一样整洁……嗯,这不是一个错误的调用。你只需要检查你的输入是否在跟踪器中,这是一个不错的钩子。这是一种预防措施,不打电话给你的隐藏追踪者