Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery find(';:焦点';)未按预期运行_Javascript_Jquery_Focus_Onblur - Fatal编程技术网

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')。长度==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();
    });
    
    但这并不完美。只有当你使用鼠标时,它才真正起作用。如果在鼠标未悬停在“跟踪器”上时,使用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)可以正常工作,但是添加额外的钩子来撤销错误的调用并不像一开始就阻止隐藏一样整洁……嗯,这不是一个错误的调用。你只需要检查你的输入是否在跟踪器中,这是一个不错的钩子。这是一种预防措施,不打电话给你的隐藏追踪者