@Extramezz

Где недочет в моей функции :\?

Написал функцию, код ниже. Она задает CSS стили элементу через заданное время и убирает их через второе заданное время, а точнее возвращает к старому значению. Работает она в содружестве с Jquerry....
Суть проблемы - как видите, использую setTimeout и если вызывать функцию часто, она работает некорректно - стили задаются, но не убираются =\ Почему?

Синтаксис:

animate(                                                  
{
	свойство:значение,
	свойство:значение,                                         
	....                                                      
	time: [время установки(мс), время существования(мс)] 
},                                      
{                                     
	свойство:значение,              
	свойство:значение,                   
	....                                          
	time: время установки(мс)                             
},                                                        
........                                        
);


//elem - элемент которому задаются стили...объявлен он в другом месте
for(var e in arguments){
	e = arguments[e];
	
	if(e.time){
		var r = (type(e.time) == "array") ? e.time[1] : false,
		t = (type(e.time) == "array") ? e.time[0] : e.time;
		delete e.time;
	}else{
		var t = 0, r = false;
	}

	var o = {};
	for(var i in e) o[i] = $(elem).css(i);
	
	(function(a,b,c,d){
	     setTimeout(function(){
	          $(elem).css(a);
	          if(d) setTimeout(function(){$(elem).css(c);}, d);
	     },b);
	})(e,t,o,r);
}


Пример использования.....
var elem = document.getElementById("test");
animate({"opacity":0, time:[0,1000]});
//Прозрачность мгновенно сменится на 0 и спустя 1с вернется к исходному значению.
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
Прекрасное односимвольное именование переменных, отсутствие рабочего примера — это все очень хорошо.

Не вникал в код и не искал логические ошибки, но рекомендую почитать про асинхронность в JS и коллбэки. Если просто взять и написать два setTimeout, первое и второе заданное время будет отсчитываться от одного и того же момента времени. То есть, если первое время будет больше второго, то сначала выполнится содержимое второго setTimeout.

Если вкратце, то второй setTimeout нужно устанавливать изнутри первого, и никак иначе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы