Почему document.activeElement.matches (': focus') возвращает false? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть этот фрагмент:

function focusChanged(event)
{
//  setTimeout(function() {

  console.log('focus now: ' + document.activeElement);
  console.log(document.activeElement.matches(':focus'));

//}, 0);
}
<div class="editor one" contenteditable="true" onfocus="focusChanged(event)">click here to focus</div>

Без тайм-аута возвращается следующее значение false:

document.activeElement.matches(':focus')
false

Консоль не открыта ( как указано в document.activeElement.matches (: focus) имеет значение false. почему это так? )

Это происходит в WebKit / Safari. Кто-нибудь может объяснить, почему это происходит? Спасибо!

РЕДАКТИРОВАТЬ:

Может быть, еще немного фона: я обнаружил вышеупомянутую проблему только после столкновения с проблемой jQuery * .is(':focus'). У меня есть старый проект, который все еще использует jQuery v1.9.1.

Этот код: $('.editor').is(':focus') отлично работал годами. Только с последним обновлением macOS Catalina 10.15.4 это начало возвращать false, даже когда у div есть фокус. Затем я попытался использовать ванильное решение JS и столкнулся с вышеуказанной проблемой.

1 Ответ

1 голос
/ 07 апреля 2020

Некоторые события реализованы немного по-разному в разных браузерах. Может показаться, что в браузерах на основе WebKit элемент не считается «сфокусированным» до тех пор, пока не будут запущены обработчики событий, а в браузерах на основе Blink (Chrome, et c.), Несмотря на то, что он является форком из (части) WebKit, он считается сфокусированным во время обработчиков событий.

Ваше решение, позволяющее завершить событие, похоже на solid обходной путь.

...