我的旋转横幅脚本中的“太多递归”

时间:2011-01-19 16:14:38

标签: javascript jquery

iKeyless.widget.Rotator.rotate();内调用init();函数时,我的旋转横幅脚本会抛出“太多递归”错误。我无法弄清楚为什么,init();只被调用一次,并且在第二次调用时有一个defer()....当页面加载它时滞后于“过多的递归”

    return {
        init: function () {
            ui.container = $("#rotating-banner");
            ui.thumbs = $("#rotating-banner .tabs .tab");
            ui.banners = $("#rotating-banner .banner");
            ui.fadeBox = $(".rotate .bd .fade-box");

            ui.thumbs.each(function (idx, el) {
                $(el).click(function () {
                    paused = true;

                    iKeyless.widget.Rotator.rotate.show(idx);
                });
            });

            iKeyless.widget.Rotator.rotate();
        },
        show: function (idx) {
            ui.fadeBox.css("display", "block");
            ui.fadeBox.animate({
                opacity: 1
            },
            .125,
            function () {
                $('.active', $(ui.banners[idx]).addClass('active').parent()).removeClass('active');

                ui.fadeBox.animate({
                    opacity: 1
                },
                .125,
                function () {
                    ui.fadeBox.css("display", "none");
                });
            });
        },
        rotate: function () {
            if (!paused) {
                this.show(counter);

                counter = counter + 1;

                if (counter === ui.thumbs.length) {
                    counter = 0;
                }

                iKeyless.widget.Rotator.rotate().defer(5000);
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

我认为问题是你需要这样做

iKeyless.widget.Rotator.rotate.defer(5000);

而不是

iKeyless.widget.Rotator.rotate().defer(5000);

Source:编写rotate()时,执行函数rotate,然后执行defer。当您编写rotate.defer()时,您将获得函数rotate,并使用在函数上定义的方法defer

另外,如果这是jQuery,你如何推迟定义?我不确定jQuery是否提供了延迟功能。如果这是Prototype,我认为defer不会采用任何参数。也许你想要delay。延迟需要几秒钟的时间,所以你想要(假设5秒,而不是5000秒):

iKeyless.widget.Rotator.rotate.delay(5);

答案 1 :(得分:0)

我不知道延迟,但我读到的是:

  

安排解释程序空闲后立即运行该函数。

但这并不意味着它实际上并没有这样做。函数rotate一次又一次地调用自身。不是线性的,而是在内部,所以你永远不会结束'顶部'调用旋转。

这意味着无限递归,所以我对这个错误并不感到惊讶。

答案 2 :(得分:0)

我不熟悉defer(),但您在旋转方法中调用rotate(),这是递归的来源。也许利用setTimeoutsetInterval之类的东西可以解决您的问题?