Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Не получается setTimeout (https://javascript.ru/forum/dom-window/29913-ne-poluchaetsya-settimeout.html)

deputat333 16.07.2012 21:25

Не получается 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);
		
	})
});

Deff 16.07.2012 21:41

$(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)
	})
});

deputat333 16.07.2012 21:49

Спасибо огромное!

Deff 16.07.2012 22:21

Поправил

deputat333 24.07.2012 01:02

Попутный вопрос - я решил всю функцию запихнуть в одну, т.к. вкладок меню 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)
	})
};

Deff 24.07.2012 01:25

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 24.07.2012 14:08

Не могу разобраться с кодом. Можешь побольше комментариев дописать что куда?

Deff 24.07.2012 14:18

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)
	})
};

deputat333 24.07.2012 23:13

Вложений: 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:

Deff 24.07.2012 23:19

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');
});


Часовой пояс GMT +3, время: 13:22.