Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.06.2014, 11:28
Интересующийся
Отправить личное сообщение для tishka Посмотреть профиль Найти все сообщения от tishka
 
Регистрация: 05.06.2014
Сообщений: 27

Поочередная анимауция
Всем здрасьте!
Есть код, который отвечает за появление 4 картинок. Данный код работает так, что картинки появляются одновременно:

$(document).ready(function(){
    $('.class-spec table tr td').mouseover(function(){
        $('.views-field-field-photo-fid .field-item:nth-child(1)', this).show("drop", 700);
        $('.views-field-field-photo-fid .field-item:nth-child(2)', this).show("drop", 700);
        $('.views-field-field-photo-fid .field-item:nth-child(3)', this).show("drop", 700);
        $('.views-field-field-photo-fid .field-item:nth-child(4)', this).show("drop", 700);
    });
});


Недавно появилась потребность сделать так, чтобы картинки появлялись по очереди.Начал копать в разных направлениях (setTimeout, queue, callback).
Выбрал все-таки setTimeout, как самый понятный. Вот что получилось:

$(document).ready(function(){
    $('.class-spec table tr td').mouseover(function(){
        $('.views-field-field-photo-fid-1', this).hide("fade", 700);
        $('.views-field-field-photo-fid', this).show();
        $('.views-field-field-photo-fid .field-item:nth-child(1)', this).show("drop", 700);
        $('.views-field-field-photo-fid .field-item:nth-child(2)', this).setTimeout(function(){show("drop", 500)}, 500);
        $('.views-field-field-photo-fid .field-item:nth-child(3)', this).setTimeout(function(){show("drop", 500)}, 1000);
        $('.views-field-field-photo-fid .field-item:nth-child(4)', this).setTimeout(function(){show("drop", 500)}, 1500);
    });
});


К сожалению, данный код не работает, выползает только первая картинка. Буду благодарен, если направите в нужное русло. Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 10.06.2014, 11:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

tishka,
примерно так ...
$(function () {
       $('.class-spec table tr td').mouseover(function () {
           var n = 1,
               td = this;
           (function show() {
               if (n > 4) return;
               $('.views-field-field-photo-fid .field-item:nth-child(' + n + ')', td).show("drop", 700, show);
               n++
           })()

       });

   })

Последний раз редактировалось рони, 10.06.2014 в 15:05.
Ответить с цитированием
  #3 (permalink)  
Старый 10.06.2014, 14:51
Интересующийся
Отправить личное сообщение для tishka Посмотреть профиль Найти все сообщения от tishka
 
Регистрация: 05.06.2014
Сообщений: 27

Заранее извиняюсь за глупые вопросы, но все же)

1. Зачем вы function show() взяли в скобки? Так надо? Я не встречал просто такого
2. Что означает строка "if (n > 4) return" ? конкретно что делает return в данном контексте? По идее ведь, тут можно было использовать любой цикл?
3. Там в конце вы написали chow, наверно имели в виду slow. Если да, то зачем? Ведь до этого уже идет скорость 700?
4. td = this; - это обязательно делать? Я так понимаю, для меньшей загрузки ресурсов?

Спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 10.06.2014, 15:12
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

tishka,
работает?
1 чтобы запустить функцию show == можно конечно show();
2. выход из функции если функция уже запускалась 4 раза -- циклом неполучится
3.опечатка , callback чтобы запустить функцию снова
4.да обязательно в данном случае - сохранение контекста иначе при втором запуске -- this внутри show укажет на window
Ответить с цитированием
  #5 (permalink)  
Старый 10.06.2014, 17:37
Интересующийся
Отправить личное сообщение для tishka Посмотреть профиль Найти все сообщения от tishka
 
Регистрация: 05.06.2014
Сообщений: 27

рони,
спасибо! Я много чего не понял, но работает.....
Вы там в 3 местах пропустили точку с запятой ,надеюсь не специально, иначе вообще взрыв мозга. В принципе, работает и так и так. На всякий случай везде в конце добавил ";".
Всё-таки такую запись

(function show() {
 if (n > 4) return;
$('.views-field-field-photo-fid .field-item:nth-child(' + n + ')', td).show("drop", 700, show);
n++
           })()


вижу впервые, не совсем понял синтаксис... А точнее, зачем вы все это взяли в скобки, и зачем потом еще в конце поставили ()...
Ответить с цитированием
  #6 (permalink)  
Старый 10.06.2014, 17:39
Интересующийся
Отправить личное сообщение для tishka Посмотреть профиль Найти все сообщения от tishka
 
Регистрация: 05.06.2014
Сообщений: 27

а, там еще какой-то баг иногда проскальзывает. 2 последние картинки появляются одновременно. Не постоянно, только когда мышкой дергать на объект и с объекта
Ответить с цитированием
  #7 (permalink)  
Старый 10.06.2014, 17:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от tishka
баг иногда проскальзывает
это не баг -- это непродуманная логика - где-то нужен флаг -- что для этой ячейки шоу запущено -- больше пока ненадо -- и ещё лучше mouseleave чем mouseover
Ответить с цитированием
  #8 (permalink)  
Старый 10.06.2014, 18:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

tishka,
(function show() {
 if (n > 4) return;
$('.views-field-field-photo-fid .field-item:nth-child(' + n + ')', td).show("drop", 700, show);
n++
           })()

тоже самое
function show() {
 if (n > 4) return;
$('.views-field-field-photo-fid .field-item:nth-child(' + n + ')', td).show("drop", 700, show);
n++
           };
show();
Ответить с цитированием
  #9 (permalink)  
Старый 11.06.2014, 09:03
Интересующийся
Отправить личное сообщение для tishka Посмотреть профиль Найти все сообщения от tishka
 
Регистрация: 05.06.2014
Сообщений: 27

Цитата:
тоже самое
да, вот так как-то привычней, по крайней мере для меня))

Цитата:
где-то нужен флаг
Ладно, я думаю не критично. Мало кто будет мышкой специально елозить, так при спокойном наведении все норм

Цитата:
лучше mouseleave чем mouseover
не, лучше mouseenter (уже поменял), мне ведь надо при наведении чтоб срабатывало
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поочередная загрузка картинок ml227 Общие вопросы Javascript 13 07.07.2013 09:17
Поочередная активация текстовых полей Meecrobe Общие вопросы Javascript 5 04.11.2011 07:24
Поочередная выборка элементов в jquery vector jQuery 5 29.06.2011 14:28