我使用onclick运行的函数来读取xml目录并打开每个商品的缩略图。
我希望脚本能够按顺序打开每个拇指。从逻辑上讲,我觉得它应该这样做,因为show命令在for循环结束时。但是该功能运行并且所有缩略图同时显示。我怎么能改变这个?为什么会这样?
function showproductthumbnails() {
for (i=0;i<xmlcatalog.length;i++){
$(catalogitem+i).show("fold", {size:3}, 300);
}
}
请注意,上面的代码只是抽出肉的摘要,但问题仍然存在。
答案 0 :(得分:2)
我该如何更改?
您可以添加一个小delay
[docs]:
$(catalogitem+i).delay(i*100).show("fold", {size:3}, 300);
为什么会这样?
循环非常快,并且调用此show
不会阻塞。动画功能异步。
答案 1 :(得分:1)
你面临的问题是show
- 就像所有jQuery动画函数一样 - 是异步的。调用show
将指令发送到队列,然后立即返回。所以你同时在所有元素上调用show
。
这样做的方法是使用delay
功能。这会增加效果队列的延迟。您需要将动画延迟300
乘以i
- 循环中的位置。
$(catalogitem+i).delay(i * 300).show("fold", {size:3}, 300);
这意味着第一个项目的动画将延迟0 * 300
ms(0ms),第二项将延迟1 * 300
ms(300ms),第三项将2 * 300
ms(600ms)等等。
答案 2 :(得分:0)
一个技巧是将自定义事件绑定到每个缩略图。让事件为其绑定的缩略图运行show()
动画,然后在回调时,选择并触发绑定到.next()
元素的同名自定义事件。净效果是一系列show()
动画,每个动画调用下一个动画,直到到达最后一个缩略图。
这样的事情:
$('.thumbnail').bind('showme', function(){ // for each thumbnail, bind 'showme'
$(this).show([your_options], function(){ // thumbnail shows itself
$(this) // starting here...
.nextAll('.thumbnail:first') // ...select the next thumbnail
.trigger('showme'); // ...and trigger the same, recursion-style
});
})
.first() // then, at the first thumbnail...
.trigger('showme'); // ...start the dominoes falling
答案 3 :(得分:0)
$.show()
仅启动动画,然后在动画运行时转到其他内容。在你的情况下,循环快速启动所有动画,它们都一起运行。有几种方法可以解决这个问题:
使用setTimeout()
延迟每个动画的开始,如下所示:
var animationTime = 300;
for (i=0;i<xmlcatalog.length;i++){
setTimeout( function() { $(catalogitem+i).show("fold", {size:3}, animationTime); }, animationTime*i;
}
第一次通过时,延迟时间为0ms,第二次为300ms,第三次为600ms,等等。
如果您不想担心计算每个动画应该开始的时间,可以使用callback
的可选$.show()
参数,该参数会在动画完成时触发:
function showThumb(i) { // recursively calls each item after the current one is done
if (i>=xmlcatalog.length)
return;
else
$(catalogitem+i).show(300, function() { showThumb(i+1); });
}
function showproductthumbnails() {
showThumb(0);
}
答案 4 :(得分:0)
我看到已经有基于jQuery的答案了,所以根据我的评论,这是一个使用超时的更基本的版本:
$(document).ready(function (e) {
var imgSrc = "http://bits.wikimedia.org/skins-1.17/vector/images/search-ltr.png?301-3";
var thumbnails = [];
for (var i = 0; i < 20; i++) {
thumbnails.push(imgSrc);
}
function showThumbnails(thumbnails, i) {
if (i >= thumbnails.length) {
return;
}
$(document.body).append($("<img src=" + thumbnails[i] + "/>"));
setTimeout(function () {
showThumbnails(thumbnails, i+1);
}, 100);
}
showThumbnails(thumbnails, 0);
});
答案 5 :(得分:0)
这是一种不同的方法,它使用.show()
函数的完成函数来启动下一个函数。
function showproductthumbnails() {
var cntr = 0;
function showNext() {
if (cntr < xmlcatalog.length) {
$(catalogitem+cntr).show(300, "fold", showNext);
++cntr;
}
}
showNext();
}
这是第一次显示并设置一个完成功能,它将启动下一个,当cntr达到极限时它将停止。这可以保证它们按顺序相互跟随。