document.activeelement возвращает тело

<input id="text1" tabindex="1" onblur="invokeFunc()"/>
<input id="text2" tabindex="2" onblur="invokeFunc()"/>

function invokeFunc(){
   // ajax request 
   alert(document.activeElement); 
   // this returns body element in firefox, safari and chrome.
}

Я пытаюсь установить фокус на размытии текстовых полей с правильным набором tabindex.

когда я вызываю функцию javascript onblur и пытаюсь получить document.activeelement, она всегда возвращает мне элемент тела вместо активного элемента, на котором находится фокус.


person Jigar Parekh    schedule 02.07.2012    source источник
comment
molily.de/weblog/javascript-fokus-zentral содержит кросс-браузерный документ. функция активный элемент.   -  person Michael Besteck    schedule 02.07.2012


Ответы (2)


Между выходом из старого элемента и входом в новый элемент активным элементом действительно является сам документ/тело.

Демонстрация: http://jsfiddle.net/u3uNP/

person ThiefMaster    schedule 02.07.2012
comment
Спасибо, понял .. я думаю, что могу сделать этот вызов асинхронным способом, чтобы установить фокус на правильном элементе после события ajax. - person Jigar Parekh; 03.07.2012
comment
Так как же убедиться, что вы нашли новый элемент, а не тело? - person strava; 22.02.2021
comment
@strava, посмотри мой ответ. - person OfirD; 06.05.2021

@ThiefMaster объяснил причину, и я хочу добавить решение для получения нового сфокусированного элемента:

Используйте focusout вместо onblur, а затем используйте свойство relatedTarget:

const inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; ++i) {
  inputs[i].addEventListener('focusout', (event) => {  
    console.log('newly focused element:', event.relatedTarget); 
  });
}
<input id="text1" tabindex="1" />
<input id="text2" tabindex="2" />

person OfirD    schedule 06.05.2021