Есть ли что-то, что я могу сделать как это (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);
});
Нет собственного решения, но есть более элегантный способ сделать это:
jQuery.extend(jQuery.expr[':'], {
focus: "a == document.activeElement"
});
Вы определяете новый селектор. См. Плагины / Разработка . Тогда вы можете сделать:
if ($("...").is(":focus")) {
...
}
или:
$("input:focus").doStuff();
Есть плагин http://plugins.jquery.com/project/focused
Также вы можете проверить Используя jQuery чтобы проверить, есть ли у ввода фокус
$ ('input: focus')
Это CSS. Вам не нужно создавать «настраиваемый селектор». Он уже существует! http://www.w3schools.com/CSS/pr_pseudo_focus.asp
Просто прикрепите любой процесс, который вы хотите сделать, к этому селектору, и он отсеет его, если рассматриваемый элемент не сфокусирован. Я сделал это недавно, чтобы keyup
не запускала проверку ошибок ввода электронной почты, когда ввод электронной почты не использовался.
Если все, что вы пытаетесь сделать, это проверить, сосредоточился ли пользователь на чем-то сам, просто сделайте следующее:
if($('input:focus').size() == 0){
/* Perform your function! */
}
Нет, нет.
Однако вы можете смоделировать это так:
$(':input')
.data('focused', false)
.focus(function() { $.data(this, 'focused', true); })
.blur(function() { $.data(this, 'focused', false); });
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; }
}
});