我的页面中有一个元素列表,我想将jQuery滑动动画应用到。但是,我喜欢它,以便动画按顺序链接,即一个元素只有在前一个动画结束时才会开始动画。
列表的长度是可变的,因此我需要找到一个动态解决方案。 我想出了这个:
function closeYear(year, speed, complete) {
$(year).next().slideUp(speed, complete);
}
function closeYears(years, speed, complete) {
if ($(years).length == 1) {
closeYear($(years).first(), speed, complete);
} else if ($(years).length > 1) {
var codeStr = ""
$(years).slice(0, $(years).length - 1).each(function(k) {
codeStr = codeStr + "closeYear($(years)[" + k + "],'" + speed + "',";
});
codeStr = codeStr + "closeYear($(years).last(),'" + speed + "',complete)" + Array($(years).length).join(")") + ";";
eval(codeStr);
}
}
使用上面的代码,我能够完成我想要的,包括能够指定动画的速度,以及在处理完所有内容时执行的complete
函数,如下所示:
closeYears($(".year"), "slow", function() {console.log("done!");})
我的问题是关于eval()
功能的使用。而且因为我对安全问题不是很了解,我想知道在我的代码,编写方式或者是否有更好/更安全/更智能的方法来做我想做的事情时,有什么值得担心的...
有任何意见吗?
答案 0 :(得分:1)
您可能只需要一个伪递归函数:
function closeYears(years, speed, complete) {
(function close(i){
if(!years[i]) return complete();
closeYear(years[i],speed,function(){
close(i+1);
} );
})(0);
}