Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.11.2013, 13:44
Аватар для Skoldin
Новичок на форуме
Отправить личное сообщение для Skoldin Посмотреть профиль Найти все сообщения от Skoldin
 
Регистрация: 28.11.2013
Сообщений: 4

setTimeout в цикле
Добрый день! У меня есть функция анимации, проявляющая элементы и срабатывающая, когда пользователь скроллит до элемента. Появилась необходимость при срабатывании функции последовательно проявить элементы списка.

Я хотел сделать так:

var list = $('#suitable').find('li');
var timeout = 0;

for(var i = 0; i < list.length; i++) {
  setTimeout(function() {
    $(list[i]).css('opacity', 1).css('transform', 'scale(1, 1)')
  }, timeout);
  
  timeout += 250;
};


Однако, этот код не работает. Не могли бы ли вы подсказать мне, что с ним не так, и как его можно правильно переделать?
Ответить с цитированием
  #2 (permalink)  
Старый 28.11.2013, 13:45
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Skoldin
этот код не работает
Что значит "не работает"? Если ошибка - так исправь ее...
Ответить с цитированием
  #3 (permalink)  
Старый 28.11.2013, 13:50
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Для правильного использования значения переменной i используй такой вариант

var list = $('#suitable').find('li');
var timeout = 0;
for(var i = 0; i < list.length; i++) {
	setTimeout(
		(function (N){
			return function() {
				$(list[N]).css('opacity', 1).css('transform', 'scale(1, 1)')
			}
		})(i)
		, 
		timeout
	);
	timeout += 250;
};
Ответить с цитированием
  #4 (permalink)  
Старый 28.11.2013, 13:58
Аватар для Skoldin
Новичок на форуме
Отправить личное сообщение для Skoldin Посмотреть профиль Найти все сообщения от Skoldin
 
Регистрация: 28.11.2013
Сообщений: 4

Спасибо! Правда я так и не понял, почему функция setTimeout не может использовать объявленную в цикле переменную
Ответить с цитированием
  #5 (permalink)  
Старый 28.11.2013, 14:25
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

http://learn.javascript.ru/play/Rw26Hb

<!DOCTYPE HTML>
<html>
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
    <style>
      #list > li {
        display: none;
        margin: 10px;
      }
    </style>
  </head>
  <body>
    <ul id="list">
      <li>Лист 1</li>
      <li>Лист 2</li>
      <li>Лист 3</li>
      <li>Лист 4</li>
      <li>Лист 5</li>
    </ul>

    <script>
      $(function() {
        var list = $('#list > li'),
            i = 0, show;
        
        (show = function() {
          	if(i++ > list.length) return;
          	list.eq(i).slideDown(300, show);
        })();
      });
    </script>

  </body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 28.11.2013, 15:22
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Skoldin
Правда я так и не понял, почему функция setTimeout не может использовать объявленную в цикле переменную
Она ее таки использует.
Только со значением, которое у нее будет на момент запуска самой функции. А не на момент выполнения собственно setTimeout()...
Ответить с цитированием
  #7 (permalink)  
Старый 28.11.2013, 15:59
Аватар для Skoldin
Новичок на форуме
Отправить личное сообщение для Skoldin Посмотреть профиль Найти все сообщения от Skoldin
 
Регистрация: 28.11.2013
Сообщений: 4

Сообщение от Ruslan_xDD Посмотреть сообщение
http://learn.javascript.ru/play/Rw26Hb

<!DOCTYPE HTML>
<html>
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
    <style>
      #list > li {
        display: none;
        margin: 10px;
      }
    </style>
  </head>
  <body>
    <ul id="list">
      <li>Лист 1</li>
      <li>Лист 2</li>
      <li>Лист 3</li>
      <li>Лист 4</li>
      <li>Лист 5</li>
    </ul>

    <script>
      $(function() {
        var list = $('#list > li'),
            i = 0, show;
        
        (show = function() {
          	if(i++ > list.length) return;
          	list.eq(i).slideDown(300, show);
        })();
      });
    </script>

  </body>
</html>
Спасибо, но там нужен определённый эффект, с масштабированием и изменением прозрачности, а у .css() нет callback'a
Ответить с цитированием
  #8 (permalink)  
Старый 28.11.2013, 16:02
Аватар для Skoldin
Новичок на форуме
Отправить личное сообщение для Skoldin Посмотреть профиль Найти все сообщения от Skoldin
 
Регистрация: 28.11.2013
Сообщений: 4

Сообщение от ksa Посмотреть сообщение
Она ее таки использует.
Только со значением, которое у нее будет на момент запуска самой функции. А не на момент выполнения собственно setTimeout()...
Т.е. дело в том, что i это не глобальная переменная, а локальная, принадлежащая другой функции? Я правильно понял, что тут дело в том, что вложенная функция не может изменить переменную родительской функции?
Ответить с цитированием
  #9 (permalink)  
Старый 28.11.2013, 16:03
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Skoldin
у .css() нет callback'a
Он таки есть у animate()...

animate( параметры, [duration], [easing], [вызов] )
Ответить с цитированием
  #10 (permalink)  
Старый 28.11.2013, 16:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Skoldin
Я правильно понял
Нет...

К тому времени, когда истечет тот таймаут, значение переменно будет не такое, что было в момент запуска этого таймаута...

Пример

(function (){
	var i=1;
	setTimeout(function (){alert(i)},1000);
	i=10;
})();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
popup окно в PHP цикле ryobi522 Общие вопросы Javascript 5 10.02.2012 02:18
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout как он работает??? namo86 Общие вопросы Javascript 16 02.02.2011 09:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02
Аргументы в setTimeout - проблема в IE 6 micscr Общие вопросы Javascript 8 28.09.2009 13:08