使用jQuery来testinginput是否有焦点

在我正在构build的网站的首页上,有几个<div>使用CSS :hover伪类在:hover时添加边框。 其中一个<div>包含一个<form> ,使用jQuery,如果其中的一个input具有焦点,它将保持边界。 除了IE6不支持以外,这个function可以完美运行:hover<a> s以外的任何元素上。 所以,对于这个浏览器,我们只使用jQuery来模仿CSS :hover使用$(#element).hover()方法:hover 。 唯一的问题是,现在,jQuery同时处理formsfocus() hover() ,当input有焦点,然后用户移动鼠标进出,边界消失。

我想我们可以使用某种有条件的方法来阻止这种行为。 例如,如果我们在鼠标上testing了任何input是否有焦点,我们可以阻止边界消失。 AFAIK,在jQuery中没有:focusselect器,所以我不知道如何做到这一点。 有任何想法吗?

jQuery 1.6+

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

jQuery 1.5及以下

编辑:随着时代的变化,我们find更好的方法来testing焦点,新的最爱是从本·阿尔曼的这个要点 :

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

这里引用Mathias Bynens:

请注意, (elem.type || elem.href)testing被添加来滤除假身体像误报。 这样,我们确保过滤除表格控件和超链接之外的所有元素。

你正在定义一个新的select器。 请参阅插件/创作 。 那你可以这样做:

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

要么:

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

任何jQuery

如果你只是想弄清楚哪个元素有焦点,你可以使用

 $(document.activeElement) 

如果您不确定版本是1.6还是更低,则可以添加:focusselect器(如果缺失):

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

CSS:

 .focus { border-color:red; } 

JQuery的:

  $(document).ready(function() { $('input').blur(function() { $('input').removeClass("focus"); }) .focus(function() { $(this).addClass("focus") }); }); 

这是一个比目前接受的答案更强大的答案:

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

请注意, (elem.type || elem.href)testing被添加来滤除假body像误报。 这样,我们确保过滤除表格控件和超链接之外的所有元素。

(由本·阿尔曼的 这个要点所取)

2015年4月更新

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

现在已经介绍了.on方法。

他们的文档在解释工作原理方面非常有用。

.on()方法将事件处理程序附加到jQuery对象中当前选定的一组元素。 从jQuery 1.7开始,.on()方法提供了附加事件处理程序所需的全部function。 有关从较旧的jQuery事件方法转换的帮助,请参阅.bind(),.delegate()和.live()。

所以,为了让您定位“input焦点”事件,您可以在脚本中使用它。 就像是:

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

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

我不完全确定你在做什么,但是这听起来像可以通过将input元素(或div?)的状态存储为一个variables来实现:

 $('div').each(function(){ var childInputHasFocus = false; $(this).hover(function(){ if (childInputHasFocus) { // do something } else { } }, function() { if (childInputHasFocus) { // do something } else { } }); $('input', this) .focus(function(){ childInputHasFocus = true; }) .blur(function(){ childInputHasFocus = false; }); }); 

内部数据存储function是使用类标记元素状态的替代方法 。

PS:你可以使用data()函数存储布尔值和任何你想要的值。 这不只是关于string:)

 $("...").mouseover(function () { // store state on element }).mouseout(function () { // remove stored state on element }); 

然后,这只是一个访问元素状态的问题。

你有没有想过使用mouseOvermouseOut来模拟这个。 也看看mouseEntermouseLeave

跟踪两个状态(hover,聚焦)为真/假标志,并且每当改变时,运行一个函数,如果两个都是假的,则删除边界,否则显示边界。

所以:onfocus集合集中=真,onblur集合集中=假。 onmouseover sets hovered = true,onmouseout sets hovered = false。 每个这些事件后,运行一个函数,添加/删除边界。

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

我通常有一个名为“noFocus”的variables,并将其设置为true。 然后,我将焦点事件添加到所有使noFocus为false的input。 然后,我添加一个模糊事件的所有input设置noFocus回true。

我有一个MooTools类很容易处理,我相信你可以创build一个jQuery插件来做同样的事情。

一旦创build完成,在做任何边界交换之前,您可以检查noFocus。

没有:重点,但有:selecthttp://docs.jquery.com/Selectors/selected

但是如果你想根据select的内容来改变事物的外观,你应该可以使用模糊事件。

http://docs.jquery.com/Events/blur

有一个插件来检查一个元素是否集中: http : //plugins.jquery.com/project/focused

 $('input').each(function(){ if ($(this) == $.focused()) { $(this).addClass('focused'); } }) 

我有一个.live(“焦点”)事件设置为select()(突出显示)文本input的内容,以便用户在input新值之前不必select它。

$(formObj)。select();

由于不同浏览器之间的差异,select有时会被导致它的点击所取代,并且在将光标置于文本字段之后立即取消select内容(在FF中大多工作正常,但在IE中失败)

我想我可以通过稍稍延迟select…

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

这工作得很好,select将坚持,但一个有趣的问题出现..如果您从一个字段选项卡到下一个,焦点将切换到下一个字段select发生之前。 由于select抢断焦点,焦点然后回来并且触发新的“焦点”事件。 这结束了一系列的inputselect在屏幕上跳舞。

一个可行的解决scheme是在执行select()之前检查该字段是否有焦点,但是如前所述,没有简单的方法来检查…我最终只是省略了整个自动亮点,而不是转动应该一个单一的jQuery select()调用一个巨大的函数载入子程序…

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

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

我最终做的是创build一个名为.elementhasfocus的任意类,它在jQuery的focus()函数中添加和删除。 当鼠标hover()函数运行时,它会检查.elementhasfocus:

 if(!$("#quotebox").is(".boxhasfocus")) $(this).removeClass("box_border"); 

所以如果它没有这个类(阅读:div内没有元素有焦点),边框被删除。 否则,没有任何反应。

简单

  <input type="text" /> <script> $("input").focusin(function() { alert("I am in Focus"); }); </script>