Sam w sobie document.activeElement
może nadal zwracać element, jeśli dokument nie jest skoncentrowany (a zatem nic w dokumencie jest skoncentrowane!)
Państwo może chcieć to zachowanie, albo może nie materia (np w keydown
przypadku), ale jeśli chcesz wiedzieć coś jest rzeczywiście koncentruje można dodatkowo sprawdzićdocument.hasFocus()
.
Poniższe informacje przedstawiają element skupiony, jeśli taki istnieje, lub inny element null
.
var focused_element = null;
if (
document.hasFocus() &&
document.activeElement !== document.body &&
document.activeElement !== document.documentElement
) {
focused_element = document.activeElement;
}
Aby sprawdzić, czy specyficzny element ma ostrość, to prostsze:
var input_focused = document.activeElement === input && document.hasFocus();
Aby sprawdzić, czy coś jest skoncentrowane, jest to znowu bardziej złożone:
var anything_is_focused = (
document.hasFocus() &&
document.activeElement !== null &&
document.activeElement !== document.body &&
document.activeElement !== document.documentElement
);
Uwaga na temat niezawodności : w kodzie, w którym sprawdza on, document.body
oraz document.documentElement
dlatego, że niektóre przeglądarki zwracają jedną z nich lub null
gdy nic nie jest skoncentrowane.
Nie bierze pod uwagę, czy <body>
(a może <html>
) miał tabIndex
atrybut, a zatem mógł się skupić . Jeśli piszesz bibliotekę lub coś i chcesz, aby była solidna, prawdopodobnie powinieneś jakoś sobie z tym poradzić.
Oto ( jednokierunkowa) wersja ( ciężkie cytaty) uzyskiwania skupionego elementu, która jest koncepcyjnie bardziej skomplikowana, ponieważ musisz wiedzieć o zwarciach, a wiesz, oczywiście, że nie pasuje do jednej linii, zakładając, że chcę, żeby było czytelne.
Nie polecę tego. Ale jeśli masz 1337 hax0r, idk ... to tam jest.
Możesz również usunąć tę || null
część, jeśli false
w niektórych przypadkach nie masz nic przeciwko . (Możesz nadal uzyskać, null
jeśli document.activeElement
jest null
):
var focused_element = (
document.hasFocus() &&
document.activeElement !== document.body &&
document.activeElement !== document.documentElement &&
document.activeElement
) || null;
Do sprawdzania, czy element specyficzny koncentruje alternatywnie Państwo mogli użyć zdarzenia, ale w ten sposób wymaga konfiguracji (i potencjalnie porzuca), i co najważniejsze, zakłada stan początkowy :
var input_focused = false;
input.addEventListener("focus", function() {
input_focused = true;
});
input.addEventListener("blur", function() {
input_focused = false;
});
Możesz naprawić założenie stanu początkowego, używając nie-zdarzeń, ale równie dobrze możesz po prostu użyć tego zamiast.