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

IT技术 javascript jquery jquery-selectors
2021-03-15 21:38:12

有什么我可以做的事情吗(也许通过插件)

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);
});
6个回答

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

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

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

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

或者:

$("input:focus").doStuff();
正如其他人所提到的,jquery 现在本身就支持这个:focus api.jquery.com/focus-selector
2021-04-25 21:38:12
这可能会导致误报。请参阅stackoverflow.com/questions/967096/...了解更多信息和简单修复(感谢 Ben Alman 和 Diego Perini)。
2021-05-08 21:38:12
也许你应该为较新版本的 jQuery 提交这个,它会很有用。
2021-05-12 21:38:12
@MLL:它只是eval()'d?我总是以不同的方式编写我的自定义选择器
2021-05-13 21:38:12
知道为什么jQuery.expr使用==而不是===吗?
2021-05-18 21:38:12

$('input:focus')

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

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

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

if($('input:focus').size() == 0){
    /* Perform your function! */
}
正确的。jQ 只识别其浏览器识别的伪类。
2021-04-21 21:38:12
有人在没有明显原因的情况下跑过并拒绝(几乎)所有这些答案,所以我+1反对
2021-05-04 21:38:12
你错了。与 CSS 不同,jQuery 没有:focusor:hover选择器。
2021-05-07 21:38:12
我会说它会因为直接传递给querySelectorAll()它或其表亲之一而起作用如果您将它与 jQuery 自定义事物一起使用,例如:input,它可能不起作用(尚未对其进行测试,这取决于 jQuery 如何标记选择器)。
2021-05-15 21:38:12
jQuery 使用 CSS 选择器。如果它适用于 CSS,它也适用于 jQ。相信我。如果您有任何疑问,请尝试此页面中的表单,然后检查 JS:ddrewdesign.com/contact触发代码在第 124 行。不过我之前没有尝试:hover过,所以我不能说。诀窍是让 JS 进行跑腿工作,以便它能够进行检查,因此您必须将其放入某种操作中。
2021-05-17 21:38:12

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

我在使用 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; }
    }
});

不,没有。

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

$(':input')
    .data('focused', false)
    .focus(function() { $.data(this, 'focused', true); })
    .blur(function() { $.data(this, 'focused', false); });
所有的答案都是除了文森特的(点击它们)。我正在为他们所有人 +1 来反驳。
2021-04-24 21:38:12
请注意,您可以使用$(this).data('focused', true)now 等。
2021-04-24 21:38:12
不知道downvotes。也许当您的答案只是第一行时,他们就这样做了。无论如何,我给了你+1 :)
2021-05-10 21:38:12