Сам по себе document.activeElement
все еще может вернуть элемент, если документ не сфокусирован (и, следовательно, ничто в документе не сфокусировано!)
Вы можете хотеть такого поведения, или оно может не имеет значения (например, в рамках события keydown
), но если вам нужно знать, что что-то действительно сфокусировано, вы можете дополнительно чек document.hasFocus()
.
Следующее даст вам сфокусированный элемент, если таковой имеется, или же null
.
var focused_element = null;
if (
document.hasFocus() &&
document.activeElement !== document.body &&
document.activeElement !== document.documentElement
) {
focused_element = document.activeElement;
}
Чтобы проверить, имеет ли фокус определенный элемент, проще:
var input_focused = document.activeElement === input && document.hasFocus();
Чтобы проверить, сфокусировано ли что-нибудь , снова сложнее:
var anything_is_focused = (
document.hasFocus() &&
document.activeElement !== null &&
document.activeElement !== document.body &&
document.activeElement !== document.documentElement
);
Надежность Примечание : В коде, в котором проверяются document.body
и document.documentElement
, это происходит потому, что некоторые браузеры возвращают один из них или null
, когда ничего не сфокусировано.
Не учитывается, если <body>
(или, может быть, <html>
) имеет атрибут tabIndex
и, таким образом, может на самом деле быть сфокусированным . Если вы пишете библиотеку или что-то еще и хотите, чтобы она была надежной, вам, вероятно, следует как-то с этим справиться.
Вот ( тяжелые воздушные кавычки) "однострочная" версия получения сфокусированного элемента, которая концептуально более сложна , потому что вы должны знать о коротком замыкании, и y 'знаете, он явно не помещается в одну строку, при условии, что вы хотите, чтобы он был читабельным.
Я не буду рекомендовать это. Но если вы 1337 hax0r, idk ... это там.
Вы также можете удалить часть || null
, если не против получить false
в некоторых случаях. (Вы можете получить null
, если document.activeElement
равно null
):
var focused_element = (
document.hasFocus() &&
document.activeElement !== document.body &&
document.activeElement !== document.documentElement &&
document.activeElement
) || null;
Для проверки, сфокусирован ли определенный элемент, альтернативно, вы могли бы использовать события, но этот способ требует настройки (и, возможно, демонтажа), и, что важно, предполагает начальное состояние :
var input_focused = false;
input.addEventListener("focus", function() {
input_focused = true;
});
input.addEventListener("blur", function() {
input_focused = false;
});
Вы могли бы исправить предположение о начальном состоянии, используя неэвентированный способ, но тогда вы могли бы просто использовать его вместо этого.