Jquery затухает несколько div с разным временем

конвертирую флеш-анимацию в jquery#

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

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

вот мой текущий код, но он крашит Firefox, предположительно, из-за того, что у меня так много setintervals, может ли кто-нибудь указать мне правильное направление, пожалуйста?

var myDiv ='#bannerHolder'
    var fib_str = '1, 2, 3, 5, 8, 13, 21, 1, 2, 3, 5, 8, 13, 21, 1, 2, 3, 5, 8, 13, 21, 1, 2, 3, 5, 8, 13'
    var widths_str = '33px, 31px, 35px, 9px, 16px, 50px, 33px, 24px, 40px, 20px, 63px, 30px, 10px, 29px, 11px, 12px, 51px, 31px, 35px, 11px, 14px, 50px, 30px, 25px, 38px, 20px, 35px'
    var pos_str = '0px, 44px, 105px, 144px, 153px, 203px, 236px, 269px, 280px, 354px, 374px, 437px, 447px, 457px, 506px, 517px, 529px, 604px, 646px, 687px, 698px, 712px, 762px, 787px, 823px, 895px, 915px'
    var color_str = '#D5E1D7, #18D4C9,#BF51C3,#1E82C9, #EDEDED, #E1C981, #C9A94F, #BDBCAA, #5DB522, #EB2F34, #823133, #004BD8, #A6A0A0, #DS9F36, #FFDB00, #69944F, #18D4C9, #BF51C3, #1E82C9, #6B949A, #FFDB00, #819E64, #BDBCAA, #54BA43, #EB2F34, #823133'
    var width = widths_str.split(",");
    var pos = pos_str.split(",");
    var color = color_str.split(",");
    var fib = fib_str.split(",");
    console.log(width);
    console.log(pos);
    console.log(color);
    var counter = width.length
    var stopper = false;
          for(i=0;i<counter;i++){
        var html = '<div id ="stripe'+i+'"/>'   
        $(myDiv).append(html)
        $('#stripe'+i).css({  'top': 0,  'left': pos[i],'position': 'absolute', 'float': 'left', 'background-color' : color[i]})
        $('#stripe'+i).attr({'height': 100, 'width': width[i], 'min-width' : width[i], 'min-height' : '100px'  })
        $('#stripe'+i).width(width[i])
        $('#stripe'+i).height('100px')
        var myfibtime = (fib[i] * 200);
        setInterval(stripeFadeOut(i), myfibtime );
                setInterval(stripeFadeIn(i), myfibtime );
    };
    function stripeFadeOut(id){
        $('#stripe'+id).fadeOut('slow');
        var myfibtime = (fib[id] * 200);
    }
    function stripeFadeIn(id){
        $('#stripe'+id).fadeIn('slow');
        var myfibtime = (fib[id] * 200);
    }

})

если я использую setInterval('stripeFadeIn(' + id + ')', myfibtime+'; я получаю, что stripeFadeIn не определен, если я попытаюсь использовать .animate, как предложил Мэтью, я получу слишком много рекурсии


person Dizzy Bryan High    schedule 19.11.2010    source источник


Ответы (2)


Поскольку вы создаете интервальный объект в своем цикле, а также в своей функции setFadeIn, это приводит к экспоненциальному созданию интервальных объектов. В конечном итоге заканчивается сбоем браузера.

Вместо этого вы можете сделать одну вещь в самом цикле, создать два интервала, то есть один для fadeOut и один для fadeIn. Вместо «медленно» используйте несколько миллисекунд по вашему выбору.

Затем ваш fadeOut должен вызываться каждый раз в myfibtime + animatingMilliseconds = fadeOutInterval. И ваш fadeIn должен вызываться через каждые fadeOutInterval + animatingMilliseconds.

Я надеюсь, что это поможет вам

Мое предложение полностью относится к вашему старому коду. Так что делай так

for(i=0;i<counter;i++){
        var html = '<div id ="stripe'+i+'"/>'   
        $(myDiv).append(html)
        $('#stripe'+i).css({  'top': 0,  'left': pos[i],'position': 'absolute', 'float': 'left', 'background-color' : color[i]})
        $('#stripe'+i).attr({'height': 100, 'width': width[i], 'min-width' : width[i], 'min-height' : '100px'  })
        $('#stripe'+i).width(width[i])
        $('#stripe'+i).height('100px')
        var myfibtime = (fib[i] * 200);
        var animTime = 1500;
        var fadeOutInterval = myfibtime + animTime;
        var fadeInInterval = fadeOutInterval  + animTime;
        setInterval(stripeFadeOut(i), fadeOutInterval );
        setInterval(stripeFadeIn(i), fadeInInterval );
    };
    function stripeFadeOut(id){
        $('#stripe'+id).fadeOut(1500);            
    }
    function stripeFadeIn(id){
        $('#stripe'+id).fadeIn(1500);
    }
person Pokuri    schedule 19.11.2010
comment
спасибо, но сейчас я немного растерялся, я изменил код в своем вопросе на предположение Мэтьюса об использовании .animate() с параметром :complete, поэтому я не знаю, говорите ли вы об исходном коде или обновленном коде, некоторый пример кода был бы действительно полезен, я ничего не получаю в этом :( Я обновил свой вопрос, чтобы удалить код, предложенный Мэтью, поскольку метод .animate вызывает слишком много рекурсии - person Dizzy Bryan High; 19.11.2010

Я бы рекомендовал изучить анимацию jQuery http://api.jquery.com/animate/ и настроить обратный вызов для обратного затухания.

В их примере для анимации используется непрозрачность, так что, возможно, это даст вам желаемый эффект.

person Matthew    schedule 19.11.2010
comment
привет, спасибо, Мэтью, я отредактировал код, чтобы использовать анимацию, но я получаю слишком много ошибок рекурсии, см. мой измененный код в вопросе. - person Dizzy Bryan High; 19.11.2010
comment
Я вижу одну проблему с вашим кодом: setTimeOut(stripeFadeIn(id), myfibtime ); немедленно вызывает stripFadeIn. Вы должны сделать setTimeout('stripeFadeIn(' + id + ')', myfibtime); - person Matthew; 19.11.2010
comment
Проблема, с которой вы столкнулись, заключается в том, что вы фактически вызываете функцию вместо определения обратного вызова. - person Matthew; 19.11.2010
comment
извините, Мэтью, я глупее, чем вы думаете, у меня есть 3 функции, одна из которых запускает затухание, и еще 2, чтобы затухать и затухать div, какой из них нужен обратный вызов? Я снова обновил вопрос, чтобы вы могли видеть текущий код, который у меня есть... - person Dizzy Bryan High; 19.11.2010
comment
и я все еще думаю, что .animate не будет работать, так как я не хочу, чтобы эта анимация останавливалась, я хочу, чтобы она продолжала зацикливаться, поэтому скрипт всегда будет прерываться с ошибкой слишком много рекурсий - person Dizzy Bryan High; 19.11.2010
comment
Метод animate() принимает обратный вызов после завершения анимации. Вам просто нужно, чтобы обратный вызов повторял анимацию. - person Matt Huggins; 19.11.2010
comment
@matt: у меня есть обратный вызов для вызова .animate(), обратный вызов для функции stripeFadeOut() вызывает stripeFadeIn(), а тот вызывает stripeFadeOut(), но с этим методом сценарий прерывается из-за слишком большой рекурсии (это то, что я хочу, потому что я не хочу, чтобы эта анимация останавливалась) если это плохо, то как лучше всего добиться зацикливания появления/исчезновения??? - person Dizzy Bryan High; 19.11.2010
comment
Я не знаю, я не видел ваш обновленный код. У меня такое чувство, что ты делаешь это неправильно. - person Matt Huggins; 19.11.2010
comment
Проблема в вашем коде заключается в том, что когда вы вызываете setInterval (или указываете обратный вызов), вы вместо этого непреднамеренно вызываете функцию. например: testMethod(myCallback()); отличается от testMethod(function(){myCallback();}); - person Matthew; 19.11.2010