JavaScript(或jQuery)中是否有“焦点”?

时间:2010-04-21 14:23:07

标签: javascript jquery jquery-selectors

我可以做这样的事情(通过插件perhap)

if ( ! $('form#contact input]').hasFocus()) {
  $('form#contact input:first]').focus();
}

基本上,将焦点设置为第一个输入,但前提是用户尚未点击任何内容?

我知道这也会奏效,但还有更优雅吗?

$(function() {
  var focused = false;
  $('form#contact input]').focus(function() {
    focused = true;
  }); 
  setTimeout(function() {
    if ( ! focused) {      
      $('form#contact input:first]').focus();
    }
  }, 500);
});

10 个答案:

答案 0 :(得分:63)

没有本机解决方案,但是有一种更优雅的方式可以做到:

jQuery.extend(jQuery.expr[':'], {
  focus: "a == document.activeElement"
});

您正在定义一个新的选择器。见Plugins/Authoring。然后你可以这样做:

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

或:

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

答案 1 :(得分:26)

$('input:focus')

这是CSS。您无需创建“自定义选择器”。它已经存在! http://www.w3schools.com/CSS/pr_pseudo_focus.asp

只需将您想要执行的任何进程附加到该选择器,如果相关元素没有被聚焦,它就会将其清除掉。我最近这样做是为了让keyup在没有使用电子邮件输入时实例化电子邮件输入错误检查。

如果您要做的就是检查用户是否专注于任何事情,请执行以下操作:

if($('input:focus').size() == 0){
    /* Perform your function! */
}

答案 2 :(得分:11)

jQuery 1.6现在有一个专用的:focus选择器。

答案 3 :(得分:9)

使用jQuery 1.3.2和Firefox 3.6.8时,我遇到了使用cletus方法的问题,因为字符串"a == document.activeElement"不是有效函数。

我修复了它定义focus键的函数。实际上,jQuery.expr[':']中定义的所有其他键都被定义为函数。这是代码:

jQuery.extend(jQuery.expr[':'], {
    focus: function(e){ return e == document.activeElement; }
});

所以,现在它按预期工作。

但是,我在Firefox 3.6.8中遇到了一些奇怪的行为(可能是FF中的一个错误?)。如果我在页面渲染时单击输入文本,并且如果我在页面加载时调用is(":focus"),我会从浏览器收到错误,由FireBug报告,并且脚本会中断。

为了解决这个问题,我用try...catch块包围了代码,错误时返回false。如果您想阻止用户遇到相同的错误,请使用它:

jQuery.extend(jQuery.expr[':'], {
    focus: function(e){
        try{ return e == document.activeElement; }
        catch(err){ return false; }
    }
});

答案 4 :(得分:7)

不,没有。

但是,您可以像这样模拟它:

$(':input')
    .data('focused', false)
    .focus(function() { $.data(this, 'focused', true); })
    .blur(function() { $.data(this, 'focused', false); });

答案 5 :(得分:6)

考虑到解决方案实际上很简单,很难找到解决这个问题的方法:



if (document.activeElement == this) {
  // has focus
}

if (document.activeElement != this) {
  // does not have focus
}




答案 6 :(得分:3)

答案 7 :(得分:2)

这是一种简洁的方法。

$(document.activeElement)

或将其插入您的示例..

if ($('form#contact input]')[0]!=$(document.activeElement)) { ... }

答案 8 :(得分:2)

我知道这是一个老问题,但可能是我的解决方案会帮助某人:)

因为这对我没有用:

if ($(this)!=$(document.activeElement)) { ... }

..从模糊功能返回“this”。所以我这样做了:

if ($(document.activeElement).attr("class") != "input_textbox"){ ... }

答案 9 :(得分:-2)

    $('*:focus')

(Necro ftw,但仍然有效且有用)