使用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中没有:focus
select器,所以我不知道如何做到这一点。 有任何想法吗?
jQuery 1.6+
jQuery添加了一个:focus
select器,所以我们不再需要自己添加它。 只需使用$("..").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还是更低,则可以添加:focus
select器(如果缺失):
(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 });
然后,这只是一个访问元素状态的问题。
你有没有想过使用mouseOver和mouseOut来模拟这个。 也看看mouseEnter和mouseLeave
跟踪两个状态(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 : //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(...)
我最终做的是创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>