Анимации, конфликтующие с setInterval ()

Я сделал какой-то скрипт, чтобы сделать обратный отсчет на моем сайте, он зацикливается на всех классах крайних сроков и меняет часы.

Вот код

self.setInterval(function(){
$('.deadline_container').each(function(){
    days = parseInt($(this).children('.deadline_days').html(),10);
    time = $(this).children('.deadline_time').html().split(':');
    hours = parseInt(time[0],10);
    minutes = parseInt(time[1],10);
    seconds = parseInt(time[2],10);
    if(seconds > 0){
        seconds -= 1;
    } else if(minutes > 0){
        minutes -= 1;
        seconds = 59;
    } else if(hours > 0){
        hours -= 1;
        minutes = 59;
        seconds = 59;
    } else if(days > 0){
        days -= 1;
        hours = 23;
        minutes = 59;
        seconds = 59;
    }
    sec = (seconds < 10) ? '0' + seconds : seconds;
    min = (minutes < 10) ? '0' + minutes : minutes;
    hh = (hours < 10) ? '0' + hours : hours;
    $(this).children('.deadline_days').html(days);
    $(this).children('.deadline_time').html([hh,min,sec].join(':'));
});
}, 1000);

У меня тоже есть код, чтобы показать наложение на div при наведении на него

$('.someDivClass').live({
    mouseover: function() {
        $(this).children('.background').children('.overlay').stop().animate({opacity:"1"}, 300);
    },
    mouseout: function() {
         $(this).children('.background').children('.overlay').stop().animate({opacity:"0"}, 300);
    }
});

Эти два фрагмента кода отлично работают, нет никаких проблем с анимацией, проблема в том, что, когда выполняется интервал, и я нахожу один из div с оверлеем, оверлейная анимация замирает, пока обратный отсчет не отсчитывает одну секунду. Иногда кажется, что анимации нет, а просто внезапно появляется наложение. Иногда выглядит неплохо, все зависит от того, в какой момент я наведу курсор на div. Я думаю, что функция setInterval останавливает очередь анимации, пока она не перестанет выполнять свой собственный код.

Я думаю, что в jquery или чем-то подобном нет потоковой передачи.

Итак, вопросы:

¿Как сделать анимацию наложений плавной вне зависимости от тактового интервала?

¿Есть ли более эффективный способ выполнить обратный отсчет или наложить анимацию?

Я использую jquery 1.8.2 и jQuery UI 1.9.0

Изменить

Раньше я этого не осознавал, у меня тоже есть изменение непрозрачности, например:

$('#top_bar, #top_bar_container').hover(
    function(event){
        $(this).stop().animate({backgroundColor:"rgba(0,0,0,0.5)"}, 300);
    },
    function(event){
        $(this).stop().animate({backgroundColor:"rgba(0,0,0,0.2)"}, 1000);
    }
);

Эта анимация работает плавно, несмотря ни на что!
Так что это может быть функция live (мне она нужна, когда я добавляю контент на страницу с помощью AJAX) или анимация непрозрачности на фоне анимации фона (может быть дороже с точки зрения процессора)

Любая помощь будет оценена, спасибо.

Изменить
Вот мой DOM

<div class="someDivClass">
    <div class="background">
        <div class="overlay">
            <div class="deadline">
                <div>Time Left</div>
                <div class="deadline_container">
                    <div class="deadline_days">14</div>
                    <div class="deadline_time">23:20:51</div>
                    <div style="clear:both;"></div>
                </div>
            </div>
        </div>
    </div>
</div>  

У меня на страничке много таких контейнеров.


person kevLinK    schedule 08.11.2012    source источник
comment
Вы запускаете этот первый код из setInterval? Ой.   -  person Bergi    schedule 08.11.2012
comment
Единственный код, который запускается из setInterval, является первым, извините, я не объяснил это хорошо   -  person kevLinK    schedule 08.11.2012
comment
Покажите нам свой DOM. Как ваши .deadline_container (содержащие .deadline_days и .deadline_times) связаны с .someDivClass элементами с их накладками и с #top_bar и #top_bar_container ???   -  person Bergi    schedule 08.11.2012
comment
Я добавил это, проверьте правку   -  person kevLinK    schedule 08.11.2012
comment
javascript ЕСТЬ однопоточный. если вы не используете веб-воркеров   -  person Jarry    schedule 08.11.2012
comment
Какой браузер? Кажется, он работает в этом jsFiddle jsfiddle.net/Hd3Xt/2 с использованием Chrome и IE 8. Поскольку Кроме того, вы должны рассчитывать время, используя объект Date, а не полагаться на свой интервал, чтобы срабатывать ровно один раз каждые 1000 мс.   -  person TimHayes    schedule 08.11.2012
comment
Это не часы, это обратный отсчет, поэтому я получаю время с помощью PHP. И это тоже Chrome   -  person kevLinK    schedule 08.11.2012
comment
вы можете попробовать использовать setTimeout () вместо setInterval (). В конце функции вы снова устанавливаете тайм-аут для той же функции, тогда не возникает проблем с таймером, вызванных однопоточным характером javascript. Это похоже на технику использования window.requestAnimationFrame.   -  person philipp    schedule 08.11.2012


Ответы (1)


Я решил эту проблему.
На самом деле это была не проблема jQuery animate или javascript setInterval (), это был сам Google Chrome.

Я пробовал это:

Как сказал philipp, я изменил первый код на setTimeout ()

Я изменил .live () на $ (document) .on ('mouseover', '.someDivClass', function () {...});

Но ничто из этого не решило проблему, поэтому, тестируя кое-что, я оптимизировал изображения на своем сайте, и проблема была решена!

Я думаю, что это происходит:
У Chrome проблема с рендерингом анимированных блоков div с непрозрачным фоном поверх БОЛЬШИХ изображений, потому что, когда я уменьшил изображение класса .background, задержка анимации исчезла.

Я протестировал код, который у меня был в начале, в Firefox 15.0.1, и никаких задержек не было.

В любом случае спасибо за ответы, проблем с анимацией больше нет

person kevLinK    schedule 09.11.2012