Я добавляю навигацию с помощью клавиатуры в главное меню на моем сайте и хочу, чтобы все открытые подменю закрывались, когда пользователь вкладывал за пределы главного меню.Поэтому у меня есть следующая функция:
var $nav = $(".navigation nav.main"),
$navItems = $nav.find("a");
$navItems.on("blur", function() {
if ($nav.find("a:focus").length === 0) {
closeMenu();
}
});
То, как я ожидаю, что это сработает, выглядит следующим образом:
- Всякий раз, когда какая-либо ссылка в меню теряет фокус ...
- Если в меню есть нет ссылок, имеющих фокус, закройте меню
Но на самом деле происходит $(nav.find("a:focus").length)
всегда 0
, даже когда я непосредственно вижу на экране, что в меню действительно есть ссылка с фокусом.
Однако, если я оберну setTimeout()
вокруг условного выражения, то это сработает так, как я.будет ожидать:
var $nav = $(".navigation nav.main"),
$navItems = $nav.find("a");
$navItems.on("blur", function() {
setTimeout(function() {
if ($nav.find("a:focus").length === 0) {
closeMenu();
}
});
});
Теперь $nav.find("a:focus").length
повышается до 1
каждый раз, когда я нажимаю Tab , до тех пор, пока я не нажму за пределами меню, в этот момент он оценивается как 0
и закрывает его.
Это именно то, как я хочу, чтобы это работало, но зачем setTimeout()
необходимо?