加载图像时幻灯片开始,但在下载所有图像之前不显示第一张图像

时间:2013-11-14 18:48:39

标签: javascript php jquery ajax json

我正在使用Cycle2创建通过PHP从文件夹加载的图像幻灯片。您可以在此处查看实时网站:http://www.element17.com/

这些图片可以放在许多不同的文件夹(“专辑”)中,因此我创建了以下功能,可以从一张专辑切换到另一张专辑:

$('.togglealbum').click(function() {
    $('#slideshow').cycle('destroy');
    $('#slideshow').html('<div class="cycle-overlay custom" id="info"></div>'+all[(this).id]);
    $('#slideshow').cycle();
    if ($('#play').is(':visible')) {
        $('#slideshow').cycle('pause');
    } else {
        $('#slideshow').cycle('pause').delay(3000).cycle('resume');
    }
    $('.togglelink,.toggleinfo').removeClass('active').addClass('fadein');
    $('#albums').fadeToggle('fast');
    $('.togglealbum').removeClass('cycle-pager-active');
    $(this).addClass('cycle-pager-active');
    $.cookie("currentalbum",(this).id,{expires:7});
});

我遇到的问题是,当加载新图像时(通过此行:$('#slideshow').html('<div class="cycle-overlay custom" id="info"></div>'+all[(this).id]);),幻灯片显示基本上立即开始播放,但在全部下载之前不会显示任何图像。 / p>

这不一定是个问题,除了通常会发生的事情是第一个图像显示的时间可能是一两秒,然后转换到下一张幻灯片(转换是7秒超时)。如果您使用较慢的互联网连接,我想您甚至可能看不到第一张幻灯片。

如何防止这种情况发生?我试图延迟幻灯片放映的开始,但这看起来非常不优雅,而且我非常希望第一张图像在加载后立即显示,但我不知道该怎么做。

上面该行的相应代码如下:

<?php
if(isset($_COOKIE["currentalbum"])) {
    $currentalbum = $_COOKIE["currentalbum"];
} else {
    $currentalbum = "gallery/01_New";
}
$photolist = getphotolist($currentalbum);
$directory = 'gallery/*';
$subfolders = glob($directory);
foreach($subfolders as $subfolder) {
    if(!file_exists($subfolder."/thumbs")) {
        mkdir($subfolder."/thumbs", 0777);
    }
    $photos = glob($subfolder.'/*.[Jj][Pp][Gg]');
    foreach($photos as $photo) {
        $photoname = explode('.',basename($photo));
        $thumbnail = $subfolder.'/thumbs/'.$photoname[0].'_thumb.jpg';
        if (!file_exists($thumbnail)) {
            makethumb($photo,$thumbnail,150);
        }
    }
    $all[$subfolder] = getphotolist($subfolder);
}
$all_json = json_encode($all);
?>

非常感谢!

1 个答案:

答案 0 :(得分:2)

Yo可以使用数据属性来延迟幻灯片放映,直到加载所有图像:

$('#slideshow').html('<div class="cycle-overlay custom" data-cycle-loader="wait" id="info"></div>'+all[(this).id]);
             Edit: This attribute, but not here though: ^^^^^^^^^^^^^^^^^^^^^^^^

检查documentation以获取更多选项。

修改:愚蠢的错误,您需要将数据属性添加到#slideshow元素,而不是添加到其子元素。

所以原来的html会是这样的:

<div id="slideshow" data-cycle-loader="wait"></div>