#javascript #jquery #html
#javascript #jquery #HTML
Вопрос:
Я пытаюсь создать простую навигацию с помощью раскрывающихся списков поднавигации. Желаемая функциональность заключается в том, чтобы раскрывающийся список скрывался через определенное количество секунд, если он не был введен мышью. Хотя, если он в данный момент завис, я бы хотел, чтобы clearTimeout не скрывался, пока мышь находится внутри него.
function hideNav() {
$('.subnav').hover(function(){
clearTimeout(t);
}, function() {
$(this).hide();
});
}
$('#nav li').mouseover(function() {
t = setTimeout(function() { $('.active').hide()}, 4000);
//var liTarget = $(this).attr('id');
$('.active').hide();
$('.subnav', this).show().addClass('active');
navTimer;
hideNav();
});
Чего мне не хватает? Я неправильно передаю дескриптор?
Комментарии:
1. И в чем именно проблема?
2. может быть, ваша область действия переменной timer неверна? Существует ли он? Попробуйте так: window.timer = setTimeout …. и clearTimeout(window.timer)
3. Что сказал @MichaelKoper — вам нужно явно создать
t
глобальную переменную. Прямо сейчас он является локальным для вашей анонимной функции наведения курсора мыши.4. Проблема в том, что он не сбрасывает время ожидания. Я изменил сценарий, чтобы определить t вне функции, но он все еще не работает.
5. @mblase75: исключение
var
сделает его неявным глобальным.
Ответ №1:
Вы также должны очистить время ожидания при наведении курсора мыши, прежде чем устанавливать новое время ожидания.
В противном случае тайм-аут, запущенный ранее, все еще будет активен, но больше не будет доступен через t-переменную.
Ответ №2:
вы можете сделать переменную таймера глобальной.
function hideNav() {
$('.subnav').hover(function(){
clearTimeout(window.t);
}
}
$('#nav li').mouseover(function() {
window.t = setTimeout(function() { $('.active').hide()}, 4000);
});
Ответ №3:
Попробуйте сделать это рекомендуемым способом (оператор JS в виде строки).:
t = setTimeout("$('.active').hide()", 4000);
Комментарии:
1. Это использует
eval
то, что не одобряется.2. Это полезно знать. W3C не предоставляет никаких примеров функции (), поэтому я предположил, что это предпочтительный способ. Я полагаю, я возьму ‘downvote’ ради изучения чего-то нового. 😉