Не получается setTimeout
Прошу помощи со следующей задачей. Есть горизонтальное меню. Я не хочу чтобы при случайном попадании курсора в область кнопки (либо меню в целом) появлялся дочерний элемент элемент с display:none. Появление элемента реализовано через fadeIn, исчезание fadeOut.
Как сделать таймаут с jquery, чтобы fadeIn и fadeOut срабатывали только если курсор ПРОБУДЕТ заданное время в области кнопки или вне области дочернего элемента соответственно? Вот код:
$(document).ready(function(){
$("#mmenu1").mouseenter(function(){
$("#droptab1").fadeIn(150);
$("#fon").fadeIn(10);
}).mouseleave(function(){
$("#droptab1").fadeOut(150);
$("#fon").fadeOut(10);
})
});
|
$(document).ready(function(){
var MinTime=1000;
function TimeShoWYes () {
if(!$("#mmenu1").hasClass('Active')){
$("#mmenu1").addClass('Active')
$("#droptab1").fadeIn(150);
$("#fon").fadeIn(10);
}}
function TimeHideYes () {
if($("#mmenu1").hasClass('Active')){
$("#mmenu1").removeClass('Active')
$("#droptab1").fadeOut(150);
$("#fon").fadeOut(10);
}}
$("#mmenu1").mouseenter(function(){
setTimeout(function() {TimeShoWYes()},MinTime)
}).mouseleave(function(){
setTimeout(function() {TimeHideYes()},MinTime)
})
});
|
Спасибо огромное!
|
Поправил
|
Попутный вопрос - я решил всю функцию запихнуть в одну, т.к. вкладок меню 7 шт.
Но тут проблема с таймаутом - он один и тот же для всех. Есть какое-то решение этого вопроса или 7 раз прописывать? Пробовал создавать массив и в качестве параметров передавать цыфры - не работает.
function menuFirstLast(TimerId_01,TimerId_02,droptab,mmenu_fon,mmenu_fon_r,mmenu_fon_l,mmenu){
var timer=[];
$(mmenu).mouseenter({
clearTimeout(timer[TimerId_02]);
timer[TimerId_01]=setTimeout({
$(droptab).fadeIn(300);
$(mmenu_fon).fadeIn(100);
$(mmenu_fon_r).fadeIn(100);
$(mmenu_fon_l).fadeIn(100);
},300)
}).mouseleave({
clearTimeout(timer[TimerId_01]);
timer[TimerId_02]=setTimeout({
$(droptab).fadeOut(100);
$(mmenu_fon).fadeOut(100);
$(mmenu_fon_r).fadeOut(100);
$(mmenu_fon_l).fadeOut(100);
},300)
})
};
|
deputat333,
При установке Генерить число
var Num_TimerID=[];//Глобальные
Num_TimerID.push( setTimeout( BB () } )
function BB () {
// Тут что-то;
}
$(mmenu).mouseenter({
for (i=0; i<Num_TimerID.length; i++){
clearTimeout(Num_TimerID[i]);
}
//
======================== А в принципе и массив не нужен - достаточно одного TimerId - на все действия Если запускается иной - все остальные TimerId уже смысла не имеют и должны стираться - занчит одного - за глаза! |
Не могу разобраться с кодом. Можешь побольше комментариев дописать что куда?
|
deputat333,
Так - пойдёт ?
var timer=[]; //
function menuFirstLast(TimerId_01,TimerId_02,droptab,mmenu_fon,mmenu_fon_r,mmenu_fon_l,mmenu){
$(mmenu).mouseenter({
clearTimeout(timer[TimerId_02]);
timer[TimerId_01]=setTimeout({
$(droptab).fadeIn(300);
$(mmenu_fon).fadeIn(100);
$(mmenu_fon_r).fadeIn(100);
$(mmenu_fon_l).fadeIn(100);
},300)
}).mouseleave({
clearTimeout(timer[TimerId_01]);
timer[TimerId_02]=setTimeout({
$(droptab).fadeOut(100);
$(mmenu_fon).fadeOut(100);
$(mmenu_fon_r).fadeOut(100);
$(mmenu_fon_l).fadeOut(100);
},300)
})
};
|
Вложений: 1
В том то и дело, что вот так
var timer=[];
function menuFirstLast(TimerId_01,TimerId_02,droptab,mmenu_fon,mmenu_fon_r,mmenu_fon_l,mmenu){
$(mmenu).mouseenter({
clearTimeout(timer[TimerId_02]);
timer[TimerId_01]=setTimeout({
$(droptab).fadeIn(300);
$(mmenu_fon).fadeIn(100);
$(mmenu_fon_r).fadeIn(100);
$(mmenu_fon_l).fadeIn(100);
},300)
}).mouseleave({
clearTimeout(timer[TimerId_01]);
timer[TimerId_02]=setTimeout({
$(droptab).fadeOut(100);
$(mmenu_fon).fadeOut(100);
$(mmenu_fon_r).fadeOut(100);
$(mmenu_fon_l).fadeOut(100);
},300)
})
};
$(document).ready(function(){
menuFirstLast(1,2,'#droptab1','#mmenu1_fon','#mmenu1_fon_r','#mmenu1_fon_l','#mmenu1');
});
не работает. Вот что пишет firebug: |
deputat333,
Поставьте alertы
var timer=[];
function menuFirstLast(TimerId_01,TimerId_02,droptab,mmenu_fon,mmenu_fon_r,mmenu_fon_l,mmenu){
$(mmenu).mouseenter({
alert(typeof(TimerId_02)+'='+TimerId_02)
clearTimeout(timer[TimerId_02]);
timer[TimerId_01]=setTimeout({
$(droptab).fadeIn(300);
$(mmenu_fon).fadeIn(100);
$(mmenu_fon_r).fadeIn(100);
$(mmenu_fon_l).fadeIn(100);
},300)
}).mouseleave({
alert(typeof(TimerId_01)+'='+TimerId_01)
clearTimeout(timer[TimerId_01]);
timer[TimerId_02]=setTimeout({
$(droptab).fadeOut(100);
$(mmenu_fon).fadeOut(100);
$(mmenu_fon_r).fadeOut(100);
$(mmenu_fon_l).fadeOut(100);
},300)
})
};
$(document).ready(function(){
menuFirstLast(1,2,'#droptab1','#mmenu1_fon','#mmenu1_fon_r','#mmenu1_fon_l','#mmenu1');
});
|
Вложений: 1
К сожалению не сработало... Алерты не выбили, вот что пишет:
|
deputat333,
У Вас походу значение TimerId_02 и TimerId_01 - не цифровое - либо не задаётся в скрипте - вы должны его передавать в качестве цифры при вызове функции И вообще очередной топик - секс по телефону - выложите ссылку на тестовую страницу или воткните в топик полный контент с HTML |
Сейчас сделаю умножение
|
Вложений: 1
Не помогло. Вот полный код компонента. Прошу помощи.
|
deputat333,
Весь Ваш скрипт:
$(document).ready(function(){
var MinTime=300;
var timerID=[];
function TimeShoWYes (ID) {
$("#"+ID+" > div[id^='droptab']").fadeIn(300);
$("#"+ID+" > div[id^='mmenu']").fadeIn(100);
}
function TimeHideYes (ID) {
$("#"+ID+" > div").fadeOut(100);
}
$("#menu_main > div[id^='mmenu']").mouseenter(function(){
var ID = $(this).attr("id");
var indeX = $("#menu_main > div[id^='mmenu']").index(this);
clearTimeout(timerID[2*indeX+1]);
timerID[2*indeX]=setTimeout(function() {TimeShoWYes(ID)},MinTime)
}).mouseleave(function(){
var ID = $(this).attr("id");
var indeX = $("#menu_main > div[id^='mmenu']").index(this);
clearTimeout(timerID[2*indeX])
timerID[2*indeX+1]=setTimeout(function() {TimeHideYes(ID)},MinTime)
})
});
На будущее (Не ставьте нумерацию в середину id или класса 2. id - достаточно на один родительский блок элемента, с которым работаем, остальные потомки-селекторы лучше делать классами без нумераций |
С такой поправкой - забавней смотриться:
<style type="text/css">
div[id^="droptab"]{
top: 187px!important;
margin-top: -130px!important;
}
</style>
<script>
$(document).ready(function(){
var MinTime=300;
var timerID=[];
function TimeShoWYes (ID) {
$("#"+ID+" > div[id^='droptab']").slideDown(600);
$("#"+ID+" > div[id^='mmenu']").fadeIn(100);
}
function TimeHideYes (ID) {
$("#"+ID+" > div").fadeOut(100);
}
$("#menu_main > div[id^='mmenu']").mouseenter(function(){
var ID = $(this).attr("id");
var indeX = $("#menu_main > div[id^='mmenu']").index(this);
clearTimeout(timerID[2*indeX+1]);
timerID[2*indeX]=setTimeout(function() {TimeShoWYes(ID)},MinTime)
}).mouseleave(function(){
var ID = $(this).attr("id");
var indeX = $("#menu_main > div[id^='mmenu']").index(this);
clearTimeout(timerID[2*indeX])
timerID[2*indeX+1]=setTimeout(function() {TimeHideYes(ID)},MinTime)
})
});
</script>
http://hostjs-mybb2011.narod.ru/deputat.html |
Мастер-класс от Deff'а)
Спасибо Вам огромное! Заработаю денег приеду к вам на стажировку) |
| Часовой пояс GMT +3, время: 10:37. |