Существует ли 'фокусирование' в 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);
});
45
задан alex 19 December 2011 в 23:17
поделиться

5 ответов

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

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

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

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

или:

$("input:focus").doStuff();
63
ответ дан 26 November 2019 в 20:56
поделиться
3
ответ дан 26 November 2019 в 20:56
поделиться

$ ('input: focus')

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

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

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

if($('input:focus').size() == 0){
    /* Perform your function! */
}
26
ответ дан 26 November 2019 в 20:56
поделиться

Нет, нет.

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

$(':input')
    .data('focused', false)
    .focus(function() { $.data(this, 'focused', true); })
    .blur(function() { $.data(this, 'focused', false); });
7
ответ дан 26 November 2019 в 20:56
поделиться

I были проблемы с подходом 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; }
    }
});
9
ответ дан 26 November 2019 в 20:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: