On the front page of a site I am building, several <div>s use the CSS :hover pseudo-class to add a border when the mouse is over them. One of the <div>s contains a <form> which, using jQuery, will keep the border if an input within it has focus. This works perfectly except that IE6 does not support :hover on any elements other than <a>s. So, for this browser only we are using jQuery to mimic CSS :hover using the $(#element).hover() method. The only problem is, now that jQuery handles both the form focus() and hover(), when an input has focus then the user moves the mouse in and out, the border goes away.

我在想我们可以用一些条件来阻止这种行为。例如,如果我们在鼠标移出时测试任何输入是否有焦点,我们可以阻止边界消失。AFAIK,在jQuery中没有:focus选择器,所以我不确定如何做到这一点。什么好主意吗?


当前回答

据我所知,你不能问浏览器屏幕上的任何输入是否有焦点,你必须设置某种焦点跟踪。

我通常有一个名为“noFocus”的变量,并将其设置为true。然后我添加一个焦点事件到所有输入,使noFocus为假。然后我添加了一个模糊事件的所有输入,设置noFocus回真。

我有一个MooTools类可以很容易地处理这个问题,我相信你可以创建一个jquery插件来做同样的事情。

一旦创建,你可以在做任何边界交换之前检查noFocus。

其他回答

2015年4月更新

由于这个问题已经出现了一段时间,并且有一些新的约定开始发挥作用,我觉得我应该提到.live方法已经被贬低了。

现在引入了.on方法。

他们的文档在解释它如何工作方面非常有用;

on()方法将事件处理程序附加到当前选择的集合 jQuery对象中的元素。从jQuery 1.7开始,.on()方法 提供附加事件处理程序所需的所有功能。为 帮助从旧的jQuery事件方法转换,参见.bind(), .delegate()和.live()。

因此,为了让你瞄准“input focused”事件,你可以在脚本中使用它。喜欢的东西:

$('input').on("focus", function(){
   //do some stuff
});

这是相当强大的,甚至允许您使用TAB键以及。

如果有人关心,现在有一个更好的方法来捕获焦点,$(foo).focus(…)

http://api.jquery.com/focus/

我设置了一个.live(“focus”)事件来选择()(突出显示)文本输入的内容,这样用户就不必在输入新值之前选择它。

$ (formObj) .select ();

由于不同浏览器之间的奇怪之处,选择有时会被引起它的点击所取代,它会取消选择内容后,将光标放置在文本字段中(在FF中工作得很好,但在IE中失败)

我想我可以通过稍微延迟选择来解决这个问题…

setTimeout(函数(){$ (formObj) .select ();}, 200);

这工作得很好,选择将持续存在,但一个有趣的问题出现了。如果您从一个字段切换到下一个字段,那么在选择发生之前,焦点将切换到下一个字段。由于select窃取焦点,焦点将返回并触发一个新的“焦点”事件。这最终导致输入选择在屏幕上跳来跳去。

一个可行的解决方案是在执行select()之前检查字段是否仍然有焦点,但如前所述,没有简单的方法来检查…我最终只是放弃了整个自动高亮,而不是把应该是一个jQuery select()调用变成一个包含子例程的巨大函数……

jQuery 1.6 +

jQuery添加了一个:focus选择器,所以我们不再需要自己添加它。只需使用$("..").is(":focus")

jQuery 1.5及以下版本

编辑:随着时代的变化,我们找到了更好的方法来测试注意力,最受欢迎的是本·阿尔曼的要点:

jQuery.expr[':'].focus = function( elem ) {
  return elem === document.activeElement && ( elem.type || elem.href );
};

引用Mathias Bynens的话:

注意(elem。类型|| elem.href)测试添加过滤假阳性如身体。这样,我们可以确保过滤掉除了表单控件和超链接之外的所有元素。

您正在定义一个新的选择器。看到插件/创作。然后你可以这样做:

if ($("...").is(":focus")) {
  ...
}

or:

$("input:focus").doStuff();

任何jQuery

如果你只想知道哪个元素有焦点,你可以使用

$(document.activeElement)

如果你不确定版本是1.6或更低,你可以添加:focus选择器。

(function ( $ ) {
    var filters = $.expr[":"];
    if ( !filters.focus ) { 
        filters.focus = function( elem ) {
           return elem === document.activeElement && ( elem.type || elem.href );
        };
    }
})( jQuery );

跟踪这两个状态(悬停,聚焦)作为真/假标志,当其中一个发生变化时,运行一个函数,如果两者都为假,则删除边界,否则显示边界。

onfocus sets focused = true, onblur sets focused = false。Onmouseover sets hovers = true, onmouseout sets hovers = false。在每个事件之后运行一个添加/删除边框的函数。