javascript - Chrome 并不总是使用 JavaScript setInterval() 重复事件

标签 javascript jquery google-chrome setinterval repeat

我想在同一位置显示多张相同大小的图像,一次一张,每次更改之间间隔 5 秒。为此,我使用了 jQuery.Timer,它使用 setInterval() 每 5 秒调用一些 show_next_image() 函数。

它实际上可以与 IE、Opera、Safara、Firefox 以及……部分与 Google Chrome 配合使用。如果我打开一个新窗口并直接输入我的网站 URL,则它无法与 Google Chrome 一起使用:它将显示第二张图像并停止。在任何其他情况下(从另一个链接重新加载,而不是在打开新窗口后立即重新加载),它都会很糟糕:人们可以在显示正面图像之前看到背面图像。

因此我想知道我的 JavaScript 源代码是否做错了。我所做的是使用正面和背面图像。当我想显示下一张图像时,通过jQuery将后面的img源设置为新图像,并且前面的图像淡出,而后面的图像淡入。您可以通过http://www.laurent-carbon.com/查看(法语)。这两个img分别用bg1和bg2来标识。

var images = ["/img/IMG_0435bg.jpg", "/img/IMG_0400bg.jpg", "/img/maisonnette 2.jpg", "/img/IMG_0383bg.jpg", "/img/IMG_0409bg.jpg", "/img/IMG_0384bg.jpg"];
var idx = 1;
var waitTime = 5000; // ms

$(document).ready(function() {
    $("#bg2").hide();
    $.timer(waitTime, load_next);
    $.preLoadImages(images);
});

function load_next(timer) {
    var toshow = images[idx];
    idx++;
    idx %= images.length;

    back_image().attr('src', toshow);

    swap_images();
}

function front_image() {
    return (idx % 2 == 0) ? $("#bg1") : $("#bg2");
}

function back_image() {
    return (idx % 2 == 0) ? $("#bg2") : $("#bg1");
}

function swap_images() {
    back_image().fadeOut('slow');
    front_image().fadeIn('slow');
}

谢谢, 锡洛

最佳答案

好吧,我已经找到了一个解决方案......不使用插件。

演示

http://jsfiddle.net/morrison/PvPXM/9/show

来源

http://jsfiddle.net/morrison/PvPXM/9/

这种方法更加简洁,消除了我在 Chrome 中查看页面时遇到的问题:动画不同步和闪烁。

您在 HTML 中唯一要做的就是将两个图像包装在 <div id="fadeBox" style="position:relative"></div> 中。

$(function() {
    var images = [
        "http://www.laurent-carbon.com/img/IMG_0435bg.jpg",
        "http://www.laurent-carbon.com/img/IMG_0400bg.jpg",
        "http://www.laurent-carbon.com/img/maisonnette 2.jpg",
        "http://www.laurent-carbon.com/img/IMG_0383bg.jpg",
        "http://www.laurent-carbon.com/img/IMG_0409bg.jpg",
        "http://www.laurent-carbon.com/img/IMG_0384bg.jpg"
        ];
    var idx = 1;
    var max = images.length;
    var easing = "swing";
    var waitTime = 5000; // ms
    var fadeTime = 2000; // ms
    var fadeShow = function(fadeTime, fadeDelay) {
        var $topImage = $("#fadeBox img:last");
        $topImage.fadeTo(fadeDelay, 1, function() {
            $topImage.fadeTo(fadeTime, 0, easing, function() {
                $topImage
                    .fadeTo(0, 1)
                    .insertBefore("#fadeBox img:first")
                    .attr("src", images[++idx == max ? idx = 0 : idx]);
                fadeShow(fadeTime, fadeDelay);
            });
        });
    };

    fadeShow(fadeTime, waitTime);
});

希望这有帮助

PS,感谢 Levi 清理了代码。

关于javascript - Chrome 并不总是使用 JavaScript setInterval() 重复事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874286/

相关文章:

javascript - 无法访问 bundle 到同一 Browserify bundle 中的模块之间的功能吗?

javascript - 如何禁用youtube提供的右键单击选项

android - 如何避免本地 Web 应用程序数据被删除?

css - Chrome 和 Safari 中相邻的 CSS 选择器出现问题

javascript - JQuery ScrollTop 适用于 Chrome,但不适用于 Firefox

javascript - 如何更改除跨度之外的文本

javascript - <object> PDF 在移动设备上不可滚动

javascript - SO 风格的警报标题

Jquery可拖动问题

Javascript 将 ID 添加到字符串内的元素