使用jQuery测试输入是否具有焦点

2020/09/24 01:21 · javascript ·  · 0评论

在我正在构建的网站的首页上,有几个<div>使用CSS :hover伪类在鼠标悬停在它们上方时添加边框。的其中一个<div>包含<form>,如果其中的输入具有焦点,则使用jQuery使用jQuery保留边框。除IE6不支持s :hover之外<a>任何其他元素外,此方法均能完美运行因此,仅对于此浏览器,我们使用jQuery来:hover使用$(#element).hover()方法模仿CSS 唯一的问题是,现在jQuery可以处理form focus() hover(),当输入具有焦点时,用户将鼠标移入和移出,边框就会消失。

我当时以为我们可以使用某种条件来停止这种行为。例如,如果我们在鼠标移开时测试了任何输入是否具有焦点,则可以阻止边框消失。AFAIK,:focusjQuery中没有选择器,所以我不确定如何实现。有任何想法吗?

jQuery 1.6以上

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

jQuery 1.5及以下

编辑:随着时代的变化,我们找到更好的方法来测试焦点,新的最爱是Ben Alman的要点

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

从马蒂亚斯Bynens引用在这里

请注意,(elem.type || elem.href)已添加测试以过滤掉诸如身体之类的误报。这样,我们确保筛选出除表单控件和超链接以外的所有元素。

您正在定义一个新的选择器。请参阅插件/创作然后,您可以执行以下操作:

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

要么:

$("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 );

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)添加测试是为了过滤掉误报率,例如body这样,我们确保筛选出除表单控件和超链接以外的所有元素。

(来自这个要点本Alman)。

2015年4月更新

由于这个问题已经存在了一段时间,并且一些新的约定开始发挥作用,所以我认为我应该提到该.live方法已经过时了。

.on现在已经引入了该方法。

他们的文档对于解释其工作原理非常有用。

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

因此,为了让您定位“以输入为焦点”事件,您可以在脚本中使用此事件。就像是:

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

这非常健壮,甚至还允许您使用TAB键。

我不确定您要做什么,但这听起来可以通过将输入元素(或div?)的状态存储为变量来实现:

$('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;
        });
});

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

PS:您可以使用该data()函数存储布尔值和任何所需内容这不仅仅是关于字符串:)

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

然后,只需访问元素的状态即可。

如果有人在乎,现在有更好的方法来吸引焦点, $(foo).focus(...)

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

您是否考虑过使用mouseOvermouseOut进行模拟。同时查看mouseEntermouseLeave

跟踪两个状态(悬停,集中)为true / false标志,每当状态更改时,运行一个函数,如果两个均为false,则删除border,否则显示border。

因此:onfocus集focused = true,onblur集focused = false。onmouseover设置为hovered = true,onmouseout设置为hovered = false。在这些事件中的每一个之后,运行添加/删除边框的函数。

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

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

我有一个MooTools类,可以很轻松地处理此问题,我敢肯定您可以创建一个jquery插件来执行此操作。

创建完毕后,您可以在进行任何边界交换之前检查noFocus。

没有:focus,但是有:selected
http://docs.jquery.com/Selectors/selected

但是,如果您要根据所选内容更改外观,则可能应该使用模糊事件。

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

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

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

我将.live(“ focus”)事件设置为select()(突出显示)文本输入的内容,以便用户在键入新值之前不必选择它。

$(formObj).select();

由于不同浏览器之间存在怪癖,选择有时会被引起选择的点击所取代,并且会在选择后立即取消选择内容,而是将光标放在文本字段中(在FF中正常运行,但在IE中失败)

我以为我可以通过在选择上稍加延迟来解决此问题...

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

这可以很好地工作,并且选择将继续存在,但是会出现一个有趣的问题。如果您从一个字段切换到另一个字段,则在进行选择之前,焦点将切换到下一个字段。由于select会失去焦点,因此焦点将返回并触发新的“焦点”事件。最终,输入级联选择整个屏幕上的跳舞。

一个可行的解决方案是在执行select()之前检查该字段是否仍然具有焦点,但是如上所述,没有简单的方法可以检查...我最终只是放弃了整个自动突出显示,而不是转向应该突出显示的内容。单个jQuery select()调用进入一个充满子程序的巨大函数...

我最后要做的是创建一个名为.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>
本文地址:http://javascript.askforanswer.com/shiyongjqueryceshishurushifoujuyoujiaodian.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!