jquery html(array)不会在数组中插入所有项

时间:2014-01-26 13:01:10

标签: javascript jquery

当我运行下面的javascript代码时,它会从Flickr加载指定数量的图像。

通过 var photos = photoGroup.getPhotos(10)代码,我从缓存中获得了10张图片。

然后,通过检查 console.log(照片);

,我可以看到该对象有10个项目

但页面上出现的实际图片少于10件......

我不知道为什么会这样工作..

提前谢谢。

<html>
<head>
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<script>
    var PhotoGroup = function(nativePhotos, callback) {
        var _cache = new Array();

        var numberOfPhotosLoaded = 0;
        var containerWidth = $("#contents").css('max-width');
        var containerHeight = $("#contents").css('max-height');

        $(nativePhotos).each(function(key, photo) {
            $("<img src='"+"http://farm" + photo["farm"] + ".staticflickr.com/" + photo["server"] + "/" + photo["id"] + "_" + photo["secret"] + "_b.jpg"+"'/>")
                .attr("alt", photo['title'])
                .attr("data-cycle-title", photo['ownername'])
                .load(function() { 
                    if(this.naturalWidth >= this.naturalHeight) {
                        $(this).attr("width", containerWidth);
                    } else {
                        $(this).attr("height", containerHeight);
                    }

                    _cache.push(this);

                    if(nativePhotos.length == ++numberOfPhotosLoaded)
                        callback();
                })
        });

        var getRandom = function(max) {
            return Math.floor((Math.random()*max)+1);
        }

        this.getPhotos = function(numberOfPhotos) {
            var photoPool = new Array();
            var maxRandomNumber = _cache.length-1;

            while(photoPool.length != numberOfPhotos) {
                var index = getRandom(maxRandomNumber);

                if($.inArray(_cache[index], photoPool)) 
                    photoPool.push(_cache[index]);
            }

            return photoPool;
        }
    }

    var Contents = function() {
        var self = this;
        var contentTypes = ["#slideShowWrapper", "#video"];

        var switchTo = function(nameOfContent) {
            $(contentTypes).each(function(contentType) {
                $(contentType).hide();
            });

            switch(nameOfContent) {
                case("EHTV") :
                    $("#video").show();
                    break;
                case("slideShow") :
                    $("#slideShowWrapper").show();
                    break;
                default :
                    break;
            }
        }

        this.startEHTV = function() {
            switchTo("EHTV");

            document._video = document.getElementById("video");
            document._video.addEventListener("loadstart", function() {
                document._video.playbackRate = 0.3;
            }, false);
            document._video.addEventListener("ended", startSlideShow, false);
            document._video.play();
        }

        this.startSlideShow = function() {
            switchTo("slideShow");
            var photos = photoGroup.getPhotos(10)
            console.log(photos);
            $('#slideShow').html(photos);
        }

        var api_key = '6242dcd053cd0ad8d791edd975217606';
        var group_id = '2359176@N25';
        var flickerAPI = 'http://api.flickr.com/services/rest/?jsoncallback=?';
        var photoGroup;

        $.getJSON(flickerAPI, {
            api_key: api_key,
            group_id: group_id,
            format: "json",
            method: "flickr.groups.pools.getPhotos",
        }).done(function(data) {
            photoGroup = new PhotoGroup(data['photos']['photo'], self.startSlideShow);
        });

    }

    var contents = new Contents();
</script>
</head>
<body>
<div id="slideShow"></div>
</body>
</html>

1 个答案:

答案 0 :(得分:2)

我根据this article修复你的方法getRandom(),并完全重写方法getPhotos():

    this.getPhotos = function(numberOfPhotos) {
        var available = _cache.length;
        if (numberOfPhotos >= available) {
            // just clone existing array
            return _cache.slice(0);
        }

        var result = [];
        var indices = [];

        while (result.length != numberOfPhotos) {
            var r = getRandom(available);
            if ($.inArray(r, indices) == -1) {
                indices.push(r);
                result.push(_cache[r]);
            }
        }

        return result;
    }

在此处检查完整解决方案:http://jsfiddle.net/JtDzZ/

但是这种方法仍然很慢,因为由于发生了相同的随机数,循环可能会很长。

如果您关心性能,则需要创建其他稳定的解决方案。例如,只对图像序列的第一个索引进行随机化。