【问题标题】:javascript/jQuery: firefox hangs on DOM loop insertion (show images one by one)javascript/jQuery:firefox 在 DOM 循环插入时挂起(一张一张地显示图像)
【发布时间】:2011-07-09 11:35:26
【问题描述】:

我有一个函数从服务器请求一些图像并以 JSON 格式返回这些图像。我迭代这些图片(比如 150 张)并将每个图片插入到一个 div 中。我希望图像一张一张显示,但浏览器一次显示它们。这使 Firefox 挂起。在 Safari/Chrome 中,性能还可以,但它们也显示得很慢,而且不是一次一个。

有什么想法吗?这是我的代码:

循环部分:

for (var i = 1; i < response.photos.length; i++) {
        var div = "a" + i;
        var subdiv = document.getElementById(div);
        var photo = response.photos[i-1]
        T.loadImage(photo, subdiv);
}

我的 loadImage 函数:

T.loadImage = function (photo, divv) {
    var subdiv = $(divv);
    var url = photo.url;
    var url_big = photo.url_big;
    if (url_big == undefined) {
        url_big = url;
    }

    subdiv.fadeOut();
    var identifier = subdiv.attr('class') + "x";

    var link = $("<a/>").attr("href", url_big).attr("id", identifier).appendTo(subdiv);
    var img = $("<img/>").attr("src", url).appendTo(link);
    img.imgCenter({parentSteps:1});

    subdiv.fadeIn();
};

谢谢!

【问题讨论】:

    标签: javascript jquery firefox dom google-chrome


    【解决方案1】:

    也许您可以稍微修改一下加载图像函数,以利用 fadeIn() 中的回调函数

    例子:

    var loadImage = function(photos, current) {
    
        if (current == count) {
    
            $("body").prepend((new Date() - startDate)/1000);
            return;
        }
    
        var div = $("<div id=a" + current + "></div>");
        $("body").append(div);
        var photo = photos[current];
    
        var url = photo.url;
        var url_big = photo.url_big;
        if (url_big === undefined) {
            url_big = url;
        }
    
        div.hide();
        var identifier = div.attr('class') + "x";
    
        var link = $("<a/>").attr("href", url_big).attr("id", identifier).appendTo(div);
        var img = $("<img/>").attr("src", url).appendTo(link);
        //img.imgCenter({parentSteps:1});
        div.fadeIn(5, function() {
            loadImage(photos, current + 1);
        });
    };
    
    loadImage(photos, current);
    

    jsfiddle 上的示例。

    【讨论】:

    • 这是我需要的,但我应该更快地迭代它们...我尝试将 div.fadeIn() 更改为 div.show() 持续时间为 0 毫秒,但事实并非如此快点。我想在 2 秒内填满我的屏幕(150 张图片).. 上述方法可以吗?谢谢。
    • 查看更新,为示例添加了持续时间,对于附加的 150 张图像,大约 2 秒显示。
    • 如果加载仍然存在问题,如果您可以给我一个示例图像,或者尺寸我可以调整它以按照您的需要加载。
    • 成功了!伟大的!谢谢。在我测试过的所有浏览器上都非常流畅..(IE8、Firefox、Chrome、Safari)。
    【解决方案2】:

    尝试使用 jQuery 的 .each 而不是 for 循环。

    例如

    $.each(response.photos,function(index,photo){
        T.loadImage(photo, $("#a" + index));
    });
    
    T.loadImage = function (photo, divv) {
        var url = photo.url;
        var url_big = photo.url_big;
        if (url_big == undefined) {
            url_big = url;
        }
    
        divv.fadeOut();
        var identifier = divv.attr('class') + "x";
    
        var link = $("<a/>").attr("href", url_big).attr("id", identifier).appendTo(divv);
        var img = $("<img/>").attr("src", url).appendTo(link);
        img.imgCenter({parentSteps:1});
    
        divv.fadeIn();
    };
    

    【讨论】:

    • 不幸的是,这不起作用。 Firefox 仍然尝试一次加载所有内容..
    • 我问过一个在 linux/windows 上工作的朋友,对他来说它可以在 Firefox 上工作。虽然我在 Mac 上工作,但我有这个愚蠢的加载 mac 棒棒糖图标 :)。 . 任何想法为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2012-09-10
    相关资源
    最近更新 更多