【问题标题】:Script not firing properly after preloader script预加载脚本后脚本未正确触发
【发布时间】:2015-04-19 19:47:13
【问题描述】:

脚本经验非常有限。

我正在尝试让一个预加载器在第二个脚本循环通过它们之前覆盖我在引导轮播中加载的图像。

这个脚本是我能得到的。

<!-- Preloader -->
<script type="text/javascript">
    //<![CDATA[
        $(window).load(function() { // makes sure the whole site is loaded
            $('#status').fadeOut(); // will first fade out the loading animation
            $('#preloader').delay(50).fadeOut('slow'); // will fade out the white DIV that covers the website.
            $('body').delay(50).css({'overflow':'visible'});
        })
    //]]>
</script>

<!-- Script to Activate the Carousel -->
<script type="text/javascript">
$('#preloader').delay(50).fadeOut('slow', function(){
  $('.carousel').carousel({
      pause: "none",
      interval: 500
  });
});
</script>

我需要的顺序是加载动画 div,覆盖在“#myCarousel”中加载的图像 > 图像已加载 > 覆盖 div 淡出 > 淡出调用:

$('.carousel').carousel({
        interval: 500, //changes the speed
        pause: "none",
    })

图像在最后一张幻灯片上闪烁并停止。

在上面的例子中,它似乎工作了——预加载器工作,轮播也工作,但没有达到预期的速度; “500”的意思是半秒。它似乎也打破了暂停功能,事实上暂停设置为“无”似乎被忽略了。

在@Shikkediel 的帮助下,脚本现在显示为:

<script type="text/javascript">
$(window).on('load', function() {

    $('#status').fadeOut()
    .queue(function() {

        $('#preloader').delay(50).fadeOut('slow', function() {
            $('#myCarousel').attr('data-ride', 'carousel');
            $('.item').first().addClass( 'active' );
            $('body').delay(50).css({'overflow':'visible'});
            $('.carousel').carousel({
            });
        });
        $(this).dequeue();
    });
});
</script>

– 速度和暂停现在在数据属性中设置,将它们设置在其中非常好。

但是,预加载器仍然没有加载图像!

这是我正在运行的测试:http://maxsendak.com/test/pu_v2/max_page.html

【问题讨论】:

  • 可能是$('.carousel').carousel({'loop': true, ... })?我不认为pause 是一个选项,除非我正在查看不同的轮播。顺便说一下,fadeOut() 方法是异步的。
  • 有一个暂停 - getbootstrap.com/javascript/#carousel - 将此设置为“无”会停止轮播暂停,这会在我需要的最后一张幻灯片上停止。
  • 是的,不同的。提一下就好了。我想问题出在它根本没有按预期工作吗?从问题上看不是很清楚。
  • 对不起,我会尝试更多地理解问题并编辑问题。
  • 我很感激您的意见,谢谢。我将更新问题以包括我的测试页。

标签: javascript jquery html css twitter-bootstrap


【解决方案1】:

这是初稿,一些优化的脚本:

$(window).on('load', function() {

    $('#status').fadeOut()
    .queue(function() {

        $('#preloader').delay(50).fadeOut('slow', function() {
            $('#myCarousel').attr('data-ride', 'carousel');
            $('.item').first().addClass('active');
            $('body').delay(50).css({'overflow':'visible'});
            $('.carousel').carousel({
                interval: 500,
                pause: 'none'
            });
        });
        $(this).dequeue();
    });
});

但它并没有完全达到预期的结果 - 图像被设置为背景,并且没有被 onload 事件检测到。我建议预加载,附加到文档并隐藏。这应该为滑块缓存它们。在这里进行 Ajax 调用似乎不太合适:

$(document).ready(function() {

    var path = 'http://www.maxsendak.com/test/pu_v2/img/people/max/';

    for (var i = 1; i <= 5; i++) {
        $('<img class="preload" src="' + path + i + '.jpg" alt=""/>').appendTo('body');
    }

    $('.preload').each(function() {
        $(this).one('load', function() {
            $(this).hide();
        });
    });

    $(window).on('load', function() {

        $('#status').fadeOut()
        .queue(function() {

            $('#preloader').delay(50).fadeOut('slow', function() {
                $('#myCarousel').attr('data-ride', 'carousel');
                $('.item').first().addClass('active');
                $('body').delay(2500).css({'overflow':'visible'}); // after slider finishes
                $('.carousel').carousel();
            });
            $(this).dequeue();
        });
    });
});

如果图像不是背景,那段脚本当然可以省略,那么 onload 事件就足够了,并且可以防止幻灯片之间的闪烁。

次要更新 - 根据this article Firefox 可能存在一些问题(至少在 Windows 7 桌面上是 37 版),预加载图像的样式与目标背景图像的样式不匹配。所以我添加了我可以在滑块上看到的相关样式 应该 就足够了(也使附加图像更具可读性):

for (var i = 1; i <= 5; i++) {

    $('<img class="preload" alt=""/>')
    .attr('src', path + i + '.jpg')
    .css({'height': '100%', 'position': 'relative', 'left': 0})
    .appendTo('body');
}

希望这是流畅的跨浏览器功能的最终细节。

【讨论】:

  • 优化的脚本很有帮助。我不知道作为背景图像的图像对于预加载器来说可能是个问题——不过,Ajax 远远超出了我的能力范围。
  • 我也不擅长它,所以我选择通过将图像附加到文档然后用普通的 jQuery 隐藏它们来进行预加载。这也应该有效,无论如何,Ajax 似乎都不是最好的工具。让我知道它是否有理想的结果(进行了现场测试)。
  • 这很有趣,在没有 Ajax 的情况下也能做到这一点 - 很多这样的工作,除了轮播没有触发,它没有像预期的那样循环图像,我已经把轮播调用“滑块完成后”,虽然我仍在测试,但这似乎是 答案。
  • 很高兴能帮上忙。似乎在主要浏览器上运行良好,但是当硬刷新完成时,我仍然注意到 Firefox 上的偶然闪烁。当尚未设置所有样式时,这显然与它的古怪有关:kylekelly.com/posts/2014/04/08/firefox-flickering.html。因此,如果您想解决它,这也应该是可以解决的(如果您需要帮助,请大声喊叫)。干杯。
  • 好的,那么必须比 Windows 7 Firefox 37 组合更准确。我想这将是一个小修复 - 我会发布一个小更新。在我的想法中,它比其他任何东西都更适合向后兼容。我无法想象这种行为会保留在浏览器规范中(但最近他们似乎在 Mozilla 有所松懈)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2017-11-03
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
相关资源
最近更新 更多