【问题标题】:Slideshow starts while images are loading but first image isn't displayed until all are downloaded幻灯片在图像加载时开始,但直到所有图像都下载完毕后才会显示第一张图像
【发布时间】:2013-11-14 18:48:38
【问题描述】:

我正在使用 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('&lt;div class="cycle-overlay custom" id="info"&gt;&lt;/div&gt;'+all[(this).id]);),幻灯片基本上立即开始播放,但在全部下载之前不会显示图像。

这不一定是个问题,但通常情况似乎是第一张图像显示一两秒,然后切换到下一张幻灯片(切换超时 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);
?>

非常感谢!

【问题讨论】:

  • 尝试使用 $(window).load() 函数等到所有内容都加载完毕后再运行代码。 stackoverflow.com/questions/544993/…
  • 我相信在加载新图像时这不起作用,因为浏览器似乎没有表明它正在加载任何东西(没有旋转轮或任何东西)。我以前试过这个没有用。
  • 如果您使用 ajax 调用来获取此信息,则应从成功函数调用您的代码

标签: javascript php jquery ajax json


【解决方案1】:

你可以使用数据属性来延迟幻灯片,直到所有图像都加载完毕:

$('#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 了解更多选项。

编辑:愚蠢的错误,您需要将 data 属性添加到您的 #slideshow 元素,而不是它的子元素。

所以在原始 html 中应该是这样的:

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

【讨论】:

  • @NaOH 也许缺少图像。你试过true吗?
  • 很遗憾,没有变化。
  • 我实际上并没有使用您的代码...我在 #slideshow 元素上声明这些属性。
猜你喜欢
  • 2019-07-18
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多