Есть ли "фокус" в JavaScript (или jQuery)?

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

Ответы

Ответ 1

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

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

Вы определяете новый селектор. См. Plugins/Authoring. Затем вы можете сделать:

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

или

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

Ответ 2

$('input:focus')

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

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

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

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

Ответ 3

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

Ответ 4

У меня возникли проблемы с применением 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, и script сломается.

Чтобы решить эту проблему, я окружил код блоком try...catch, возвращая false при ошибке. Используйте его, если вы хотите, чтобы ваши пользователи не испытывали такую ​​же ошибку:

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

Ответ 5

Нет, нет.

Однако вы можете имитировать это следующим образом:

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

Ответ 7

Неудачно трудно найти решение этой проблемы с учетом решения на самом деле очень просто:

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

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

Ответ 8

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

поскольку это не помогло мне:

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

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

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

Ответ 9

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

$(document.activeElement)

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

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

Ответ 10

    $('*:focus')

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