Дополнительно
Как узнать, какой элемент DOM имеет фокус?
Я хотел бы узнать на JavaScript, какой элемент в данный момент имеет фокус. Я просмотрел DOM и пока не нашел то, что мне нужно. Есть ли способ сделать это и как?
Причина, по которой я искал это:
Я пытаюсь заставить клавиши, такие как стрелки и enter
перемещаться по таблице элементов ввода. Tab работает сейчас, но enter и стрелки не работают по умолчанию, как кажется. Я настроил обработку клавиш, но теперь мне нужно понять, как переместить фокус в функции обработки событий.
1226
16
Используйте
document.activeElement
, он поддерживается во всех основных браузерах.Раньше, если вы пытались узнать, какое поле формы имеет фокус, вы не могли этого сделать. Чтобы эмулировать обнаружение в старых браузерах, добавьте обработчик события "фокус" для всех полей и запишите последнее сфокусированное поле в переменную. Добавьте обработчик "blur", чтобы очистить переменную при наступлении события blur для последнего сфокусированного поля.
Похожие ссылки:
Как сказал JW, вы не можете найти текущий сфокусированный элемент, по крайней мере, независимым от браузера способом. Но если ваше приложение работает только в IE (а некоторые работают...), вы можете найти его следующим способом:
EDIT: Похоже, что в IE не все так плохо, в конце концов, это часть проекта HTML5 и, похоже, поддерживается последними версиями Chrome, Safari и Firefox, по крайней мере.
Если вы можете использовать jQuery, теперь он поддерживает :фокус, просто убедитесь, что вы используете версию 1.6+.
Эта инструкция поможет вам текущему элементу.
От: https://stackoverflow.com/questions/516152/how-to-select-an-element-that-has-focus-on-it-with-jquery/2061798#2061798
документ.activeElement
сейчас [часть работает на HTML5 проекта] спецификация(http://www.w3.org/TR/html5/editing.html#dom-document-activeelement), но это может не поддерживаться в некоторых неглавных/мобильный/старых браузерах. Вы можете вернуться к
querySelector(если это поддерживается). Это's также стоит отметить, что документ.activeElement
вернет `документ.тело-если бы не элемент фокусируется на — не Даже если окно браузера не'т иметь фокус.Следующий код позволит обойти эту проблему и вернуться к
querySelector
дает немного лучшую поддержку.Кроме того, что следует отметить, это разница в производительности между этими двумя методами. Запрос документа с селекторами всегда будет намного медленнее, чем доступ к
activeElement
собственность. Увидеть это тест jsperf.com .Сам по себе документ.activeElement все еще может вернуть элемент, если документ не'т сосредоточился (и, следовательно, не в документе ориентирован!)
Вы можете хотите, что поведение, или он может не имеет значения (например, в
вниз
событие), но если вам нужно что-то узнать на самом деле, можно дополнительно проверитьдокумент.hasFocus()
.Следующие даст вам сфокусированного элемента, если есть один, или еще
нуль
.Чтобы проверить, является ли конкретные элемент имеет фокус, он'ы проще:
Чтобы проверить, является ли ничего - это целенаправленный, это's более сложные снова:
*Надежность Примечание**: в коде, где она проверяет против документа.тела " и " документ.функцию documentelement
, это потому, что некоторые браузеры возвращают один из этих или
нуль`, когда ничего не ориентируется.Это не'т на счет если в
<тело>
(или, может быть, в<html-код>
) у атрибутаtabindex В
и, следовательно, может на самом деле быть сфокусированным. Если вы'вновь пишу библиотеку или что-то и хочу, чтобы оно было надежным, вы должны, вероятно, справиться, что-то.Здесь'ы (тяжелый airquotes) "один-вкладыш" по версии получения сфокусированного элемента, который концептуально сложнее потому что вы должны знать о короткое замыкание, и y'знаю, это явно не'т помещается в одну строку, если вы хотите, чтобы это было читабельно. Я'м не буду рекомендовать этот отель. Но если вы'вновь в 1337 hax0r, ИДК... это's там. Вы также можете удалить
|| значение null,
часть, если вы не'т ум становитсяfalse
в некоторых случаях. (Вы все еще можете сделатьнуль
, еслидокумент.activeElement
нулевой
):Для проверки, если элемент находится в фокусе, либо вы можете использовать события, но этот способ требует установки (и потенциально разобрала), и главное, принимает исходное состояние:
Вы могли бы исправить исходное состояние предположения с помощью не событийными, но тогда вы могли бы также просто использовать это вместо этого.
документ.activeElement может по умолчанию в
<тело>
элемент, если нет фокусируемые элементы в фокусе. Кроме того, если элемент находится в фокусе и окно браузера расплывается,activeElement
продолжат удерживать сфокусированный элемент.Если любой из этих двух поведений не желательно, рассмотрим УСБ-ориентированного подхода:
документ.querySelector( ':в центре внимания' )
.Мне понравился подход, используемый Джоэл, но я также люблю простоту документ.activeElement
. Я использовал jQuery и объединил два. Старых браузерах, что Дон'т поддерживать документ.activeElement будет использовать в jQuery.данных()
для хранения значения 'hasFocus'. Новые браузеры будут использовать документ.activeElement. Я предполагаю, что
документ.activeElement будет иметь более высокую производительность.Маленький помощник, что я'вэ, используемыми для этих целей в MooTools:
Таким образом, вы можете проверить, если элемент имеет фокус с эл.hasFocus()
при условии
startFocusTracking()` был призван на данного элемента.Библиотека jQuery поддерживает
:фокус псевдо-класс, как тока. Если вы ищете его в jQuery документации, проверить Под на "селекторы", где он указывает вам на [CSS от W3C документацию][1]. Я'вэ проверял С хрома, ФФ и IE 7+ и выше. Обратите внимание, что для того, чтобы работать в IE, в
<!Тип документа... должны существовать на HTML-странице. Вот пример, предполагая, что вы'вэ присвоен ID к элементу, который имеет фокус:Если вы хотите получить объект, который является экземпляром
элемент``, необходимо использовать
документ.activeElement, но если вы хотите получить объект, который является экземпляром ``текст``, вы должны использовать
документ.getSelection().focusNode``.Я надеюсь, что помогает.
Существуют потенциальные проблемы с помощью документа.activeElement. Рассмотрим:
Если пользователь ориентируется на внутренний div, а затем документ.activeElement по-прежнему ссылается на внешний див. Нельзя использовать документ.activeElement, чтобы определить, какой из внутренних дел's имеет фокус.
Следующая функция получает вокруг этого, и возвращает сфокусированного узла:
Если вы предпочитаете получить сфокусированный элемент, использовать с:
Если вы're, используя jQuery, вы можете использовать это, чтобы выяснить, если элемент является активным:
Читая другие ответы, и пытался разобраться в себе, он кажется документе.activeElement даст вам элемент, который вы должны в большинстве браузеров.
Если у вас есть браузер, который не'документ поддержки T.activeElement если у вас есть библиотека jQuery, вы должны быть в состоянии заполнить его на все события фокуса с что-то очень простое вроде этого (непроверенных, как я Дон'Т есть браузер, удовлетворяющие этим критериям для рук):
С Dojo, вы можете использовать в dijit.getFocus()
Я нашел следующий фрагмент кода будет полезно, когда пытаются определить, какой элемент в данный момент имеет фокус. Скопируйте следующий текст в консоли вашего браузера, и каждую секунду он будет выводить информацию о текущем элементе, который имеет фокус.
Не стесняйтесь модифицировать консоль.войдите в журнал что-то другое, чтобы помочь вам точно определить элемент, если распечатать весь элемент не поможет вам определить элемент.
Просто помещаю это здесь, чтобы дать решение, к которому я в итоге пришел.
Я создал свойство document.activeInputArea, использовал аддон jQuery's HotKeys для перехвата событий клавиатуры для клавиш со стрелками, tab и enter, а также создал обработчик событий для щелчков по элементам ввода.
Затем я настраивал activeInputArea при каждом изменении фокуса, чтобы использовать это свойство для определения своего местоположения.
Однако все это легко испортить, потому что если в системе есть ошибка и фокус находится не там, где вы думаете, то очень трудно восстановить правильный фокус.