Есть ли в JavaScript «фокус» (или jQuery)? - PullRequest
45 голосов
/ 21 апреля 2010

Есть ли что-то, что я могу сделать, как это (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 ]

63 голосов
/ 21 апреля 2010

Нет нативного решения, но да, есть более элегантный способ сделать это:

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

Вы определяете новый селектор. См. Плагины / Авторские . Тогда вы можете сделать:

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

или

$("input:focus").doStuff();
26 голосов
/ 21 апреля 2010

$('input:focus')

Это CSS. Вам не нужно создавать «пользовательский селектор». Это уже существует! http://www.w3schools.com/CSS/pr_pseudo_focus.asp

Просто прикрепите любой процесс, который вы хотите сделать к этому селектору, и он отсеет его, если рассматриваемый элемент не сфокусирован. Я сделал это недавно, чтобы не дать keyup создать экземпляр проверки ошибок ввода электронной почты, когда ввод электронной почты не использовался.

Если все, что вы пытаетесь сделать, это проверить, сосредоточился ли пользователь на чем-либо, просто сделайте это:

if($('input:focus').size() == 0){
    /* Perform your function! */
}
11 голосов
/ 10 мая 2011

jQuery 1.6 теперь имеет выделенный селектор :focus.

9 голосов
/ 13 августа 2010

У меня были проблемы с подходом cletus, использующим jQuery 1.3.2 и Firefox 3.6.8, потому что строка "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; }
    }
});
7 голосов
/ 21 апреля 2010

Нет, нет.

Однако вы можете смоделировать это так:

$(':input')
    .data('focused', false)
    .focus(function() { $.data(this, 'focused', true); })
    .blur(function() { $.data(this, 'focused', false); });
6 голосов
/ 03 августа 2015

Очень сложно найти решение этой проблемы, поскольку решение на самом деле очень простое:

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

if (document.activeElement != this) {
  // does not have focus
}
3 голосов
/ 21 апреля 2010
2 голосов
/ 18 февраля 2013

Я знаю, что это старый вопрос, но, может быть, мое решение кому-нибудь поможет:)

, так как у меня это не сработало:

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

.. где "this" возвращается из функции размытия. Итак, я сделал это:

if ($(document.activeElement).attr("class") != "input_textbox"){ ... }
2 голосов
/ 15 апреля 2011

Вот краткий способ сделать это.

$(document.activeElement)

или подключить его к вашему примеру ..

if ($('form#contact input]')[0]!=$(document.activeElement)) { ... }
0 голосов
/ 28 января 2014
    $('*:focus')

(Necro ftw, но все еще действует и полезен)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...