Як очистити фокус у JavaScript?


159

Я знаю, що це не повинно бути таким важким, але я не зміг знайти відповідь в Google.

Я хочу виконати фрагмент javascript, який очистить фокус від того, на якому елементі він знаходиться, не знаючи заздалегідь, на якому елементі знаходиться фокус. Він повинен працювати над Firefox 2, а також більш сучасними браузерами.

Чи є хороший спосіб це зробити?


що означає чіткий фокус? - це те саме, що і розмиття?
plodder

3
Я хочу зробити так, щоб жоден елемент у браузері не зосереджувався.
Андрес

Відповіді:


170

Відповідь: document.activeElement

Щоб робити те, що ви хочете, використовуйте document.activeElement.blur()

Якщо вам потрібно підтримати Firefox 2, ви також можете скористатися цим:

function onElementFocused(e)
{
    if (e && e.target)
        document.activeElement = e.target == document ? null : e.target;
} 

if (document.addEventListener) 
    document.addEventListener("focus", onElementFocused, true);

8
Якщо Firefox 2, що має 0,66% частки веб-переглядача, є порушником угод ... У мене є виправлення, яке є в моїй відредагованій відповіді.
jps

21
У 2013 році частка браузера Firefox 2 істотно менше 0,66%, а простий document.activeElement.blur()- найкращий спосіб досягти цього ефекту.
chowey

88

.focus()а потім .blur()ще щось довільне на вашій сторінці. Оскільки фокус може мати лише один елемент, він передається цьому елементу і потім видаляється.


Чи є спосіб зробити невидимим елементом, який має фокус?
Андрес

1
Я не фахівець з найкращого способу зробити це; але ви, безумовно, можете розмістити його поза екраном або поза межами overflow: clipстильового елемента. Але ви можете просто використовувати поле, яке вже існує на сторінці. Або створіть його лише за цією метою та видаліть його знову.
Кевін Рейд,

Я думаю, що встановлення фокусу на елементі поза екраном змусить прокрутити цей елемент. Однак ви можете створити невидимий елемент за ціллю. Незважаючи на це, у деяких веб-переглядачів може бути важко усунути каре. Просто розмиття (), ймовірно, працювало б краще. Ви все ще можете отримати ключі з обробником подій клавіатури (keydown).
Alexis Wilke

5
Ця відповідь застаріла і не застосовується у 2017 році. Використовуйте натомість activeElement, як у stackoverflow.com/a/2520670/39808
Пол Фішер

Він все ще працює, просто довше і переміщує фокус (що може заважати навігації TAB). Також не відразу видно, що має бути "щось інше довільне".
користувач202729

49
document.activeElement.blur();

Працює неправильно в IE9 - він розмиває все вікно браузера, якщо активним елементом є тіло документа. Краще перевірити цей випадок:

if (document.activeElement != document.body) document.activeElement.blur();

Це правда, але сьогодні майже ніхто не використовує IE9.
Дональд Дак

18

Жоден із наведених тут відповідей не є абсолютно правильним при використанні TypeScript, оскільки ви можете не знати тип обраного елемента.

Тому буде кращим:

if (document.activeElement instanceof HTMLElement)
    document.activeElement.blur();

Крім того, я не хочу перешкоджати використанню рішення, прийнятого у прийнятій відповіді, оскільки розмиття, що виникає, не є офіційною специфікацією і може порушитись у будь-який момент.


6
Приємно бачити, як на запитання, яке я задав ще в 2010 році, продовжує відповідати, що змінюється.
Андрес

2

dummyElem.focus (), де dummyElem - це прихований об'єкт (наприклад, має негативний zIndex)?


0

Ви можете зателефонувати window.focus ();

але переміщення або втрата фокусу може перешкоджати будь-кому, хто використовує клавішу вкладки, щоб обійти сторінку.

Ви можете прослухати клавішу 13 і відмовитись від ефекту, якщо натиснути клавішу вкладки.


-3

З jQuery це просто: $(this).blur();


2
Це стара відповідь, тому ви, можливо, знаєте вже зараз, але є дві причини, за якими ця відповідь не застосовується. 1. Передбачається, що ОП використовував jquery, 2. thisповинен бути зосередженим елементом, тоді як у питанні прямо зазначено, що ОП не знає сфокусованого елемента достроково.
Брендон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.