Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Рекурсия в setInterval


Автор: platedz1 2.2.2013, 23:05
Нужно последовательно выполнить одну функцию с разными параметрами

Код примерно такой


Код


function setint(elem)

{

var seti1 = setInterval(function()

        {

            elem.style.left = (parseInt(elem.style.left)+10)+"px";

            if(parseInt(elem.style.left) > 100)

                {

                    clearInterval(seti1);

                }

        },100);

}

setint(document.getElemetnById("id_1"));


Соответственно, после того, как setint выполнилось с id_1, нужно его выполнить c id_2, затем с id_3, а потом опять с id_1 и так по кругу. Подскажите, пожалуйста, как это можно сделать?

Автор: skyboy 3.2.2013, 00:27
вариант 1. три интервала — каждый со своими данными и интервалом ×3. вариант хорош, если количество фиксировано, а данные, уникальные для каждого прохода — неизменны. 
вариант 2. вынести переменную за пределы инетрвальной функции и менять её. 
насчет того, как этот параметр передавать извне — передавать массив. а в интервальной функции элементы массива местами менять.

Автор: Arantir 3.2.2013, 00:28
Анимацию делаете? Лучше воспользуйтесь http://jquery.com/, это такой набор готовых скриптов. Есть расширение jQueryUI практически со всеми воображаемыми видами анимации. 
И последовательный вызов там сделать очень просто, функция .animate принимает в качестве аргумента callback (т.е. функцию, которая будет в вызвана по завершению анимации).
Ну а зациклить по набору элементов несложно.

Пример не претендует на элегантность, но суть отображает:
Код

    var elements = ["#id_1", "#id_2", "#id_3"];
    var i = 0;

    function anim(i)
    {
        $(elements[i]).animate(
            {left: "+=100"},
            300,
            function(){
                //Завершена анимация одного элемента
                i++;
                i = (i >= elements.length) ? 0 : i;
                anim(i);
            });
    }
    anim(i);


Автор: platedz1 3.2.2013, 01:07
Спасибо, в целом Вышло.

Буду теперь пробовать передать параметры через объект.

Автор: platedz1 3.2.2013, 01:35
Подскажите, пожалуйста, а как бы мне теперь вместо 

 var elements = ["#id_1", "#id_2", "#id_3"];

передать объект

var elem = object_num


Т.е. у меня получается 

var object_1 = {a: "a1",b:"b1"}
var object_2 = {a: "a2",b:"b2"}
var object_3 = {a: "a3",b:"b3"}

Автор: Arantir 3.2.2013, 03:04
platedz1, знаете, чтобы разбираться в JS достаточно знать всего несколько важных моментов. Но почему-то большинство это упускает.

В JS все и так есть объекты. По-этому функции можно совать прямо в аргументы и всякое такое... Почти все - это просто объекты или массивы объектов.
Код
var elements = [object_1, object_2, object_3];
ну или сразу
Код

var elements = [
     {a: "a1",b:"b1"},
     {a: "a2",b:"b2"},
     {a: "a3",b:"b3"},
     ];

Например
Код

object_1["a"] = 0;
alert(object_1.a); // выведет ноль
object_1.b = 1;
alert(object_1["b"]); // выведет единицу
// конечно есть парочка вполне логичных ограничений:
elements = 0;
elements.c = 0; // с числами так сделать нельзя

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

Объект вы передаете без проблем. Нужно всего лишь правильно им потом воспользоваться (ну то есть вы же не станете умножать между собой массивы или пробовать вызывать число, как функцию).

Код

$(elements[i].a).animate( // например, elements[0].a == "a1"
ну или в каком поле у вас там id

Автор: platedz1 3.2.2013, 03:29
Спасибо, большое не знал, что так можно. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)