Итак, я делаю модальное окно, которое фокусируется на нем, когда оно отображается. И если пользователь нажимает снаружи, я хочу это скрыть. Я реализовал это с помощью событий фокуса.
В случаях, когда у модального окна есть дочерний элемент, на который можно сфокусироваться, модальное окно теряет фокус, я также обработал это в приведенном ниже коде. Эти случаи правильно обрабатываются onFocusLoss
, но не onFocusLoss2
.
function onClickButton() {
var modal = document.getElementById('modal');
modal.style.visibility = 'visible';
modal.focus();
}
function onFocusLoss() {
var modal = document.getElementById('modal');
setTimeout(function() {
var activeEl = document.activeElement;
if (modal !== activeEl && !modal.contains(activeEl)) {
modal.style.visibility = 'hidden';
}
}, 0);
}
function onFocusLoss2() {
var modal = document.getElementById('modal');
var activeEl = document.activeElement;
if (modal !== activeEl && !modal.contains(activeEl)) {
modal.style.visibility = 'hidden';
}
}
#modal {
position: fixed;
visibility: hidden;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid red;
}
#modal > div {
padding: 16px;
}
<button onclick='onClickButton()'>Show Modal</button>
<div id='modal' tabindex='-1' onfocusout='onFocusLoss()'>
<div>Focus Test</div>
<div>
<input>
</div>
</div>
Вот как я предполагаю, что события фокуса происходят, когда модальное окно сфокусировано, а затем я щелкаю внутри ввода, затем сначала модальное окно теряет фокус, тело является активным элементом, а затем входной элемент становится активным элементом, а тело теряет фокус. тело, в то время как в onFocusLoss
, activeEl
- это вход.
Мой вопрос в том, почему один подход работает, а другой нет? Мне нужна хорошая техническая причина. Если ваш ответ таков, что он дает достаточно времени, чтобы элемент ввода получил фокус, я хочу знать, как вы можете сказать, что времени достаточно и всегда будет работать?
Мое решение основано на этом ответе Хотя .