我缺少对javascript函数流控制的一些基本理解...
我创建了一个jquery幻灯片。该节目分为逻辑部分,每个部分由一个功能控制(以后可以轻松添加部分)......
function myslideshow() {
section1();
section2();
section3();
}
每个部分都有多个由jquery语句,动画,定时内容组成的函数......所以也许......
function section1() {
firstPart();
setTimeout('secondPart()',5000);
setTimeout('thirdPart()',6000);
}
现在这是我的问题......我想在section1()内部定义函数“firstPart(),secondPart(),thirdPart()”。我想出于各种原因这样做:
所以我想将该部分及其所有相应部分保留在该部分内。
我似乎无法让它工作......当我在该部分内部定义“部分”时,所有功能都同时运行。
理想情况下,我想拥有的是:
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动画)来完成。
我很欣赏你能提供的任何方向。谢谢!
答案 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);