使这些javascript函数更具可移植性

时间:2011-10-05 14:38:42

标签: javascript jquery flow-control

我缺少对javascript函数流控制的一些基本理解...

我创建了一个jquery幻灯片。该节目分为逻辑部分,每个部分由一个功能控制(以后可以轻松添加部分)......

function myslideshow() {
    section1();
    section2();
    section3();
}

每个部分都有多个由jquery语句,动画,定时内容组成的函数......所以也许......

function section1() {
    firstPart();
    setTimeout('secondPart()',5000);
    setTimeout('thirdPart()',6000);
}

现在这是我的问题......我想在section1()内部定义函数“firstPart(),secondPart(),thirdPart()”。我想出于各种原因这样做:

  1. 每个部分可能在逻辑上都有自己的“部分”
  2. 该部分的可移植性
  3. 所以我想将该部分及其所有相应部分保留在该部分内。

    我似乎无法让它工作......当我在该部分内部定义“部分”时,所有功能都同时运行。

    理想情况下,我想拥有的是:

    function section1() {
        firstPart();
        setTimeout('secondPart()',5000);
        setTimeout('thirdPart()',6000);
    
        function firstpart(){  
             //some code here
        }
    
        function secondPart(){  
             //some code here
        }
    
        function thirdPart(){  
             //some code here
        }
    
    }
    

    但是,这再次没有成功;实际上它工作正常我只是没有正确实现它!不确定我是否需要利用函数回调(甚至不确定如何以“可扩展的方式”设置它)。

    另一个需要改进的方面:setTimeouts用于确保secondPart在firstPart之后运行...想知道是否有更好的方法来“等待”上一个函数(使用jquery动画)来完成。

    我很欣赏你能提供的任何方向。谢谢!

3 个答案:

答案 0 :(得分:4)

您正在错误地调用“setTimeout()”:

setTimeout(secondPart, 5000);

这将传递对本地函数的引用。传递字符串时,运行时系统将在全局上下文中计时器时对其进行评估。因此,它将找不到您的本地功能。

关于你的上一个问题,大多数(如果不是全部)jQuery动画例程允许将函数作为最后一个参数传递。动画完成后运行该功能。同样,在这种情况下,您应该传递对函数的引用,而不是包含函数调用表达式的字符串。 (我怀疑无论如何都适用于jQuery。)

答案 1 :(得分:0)

一种方法是创建一个匿名“部分”列表,然后从控制函数中依次调用它们。每个动画列表的最终回调将按顺序调用下一部分。这是一个例子:

var Section1 = {
  index: 0,

  nextPart: function () {
    if (Section1.index < parts.length) {
      parts[Section1.index++]();
    }
  },

  parts: [
    // Part 1
    function () {
      $('.example').animate({
        // stuff
      }).animate({
        // stuff
      }).animate({
        // stuff
      }, Section1.nextPart);
    },

    // Part 2
    function () {
      $('.example').animate({
        // stuff
      }).animate({
        // stuff
      }).animate({
        // stuff
      }, Section1.nextPart);
    },
  ] 
};

在这个例子中,我创建了一个 Section1 模块,你可以调用 Section1.nextPart()来启动动画序列。

请注意,定时器的问题仍然适用于部分本身:您还希望Section2等到第1部分完成,这意味着您需要在顶部再次使用这个完全相同的结构来控制部分。我认为,这是否真的有意义取决于分解这些部分的重要性。

答案 2 :(得分:0)

不确定我是否回答了正确的问题,但我发现模块模式是设置命名空间和结构对象的简单方法:

http://www.yuiblog.com/blog/2007/06/12/module-pattern/

因此,将任何函数放入您想要公开的回报中,其余函数都是私有的。类似的东西:


    var s1 = function Section1() {
        function firstpart(){  //Private and auto-execute
             //some code here
        }();

        function secondPart(){  
             //some code here
        }
        function thirdPart(){  
             //some code here
        }

        return { //Public stuff
            secondPart:secondPart,
            thirdPart:thirdPart
        };
    }();

    setTimeout(s1.secondPart, 5000);
    setTimeout(s1.thirdPart, 6000);