随机播放jQuery对象的一部分但返回整个对象

时间:2014-08-11 16:51:01

标签: javascript jquery

在一个jQuery对象中,我想将所有元素洗牌,但第一个。经过不同的尝试,我想出了这个:

var $shuffled = $('.slide').slice(1).shuffle().end();

然而,这会返回一个空对象。我怎样才能首先选择一个对象的一部分(切片),然后将其洗牌(自定义函数),然后设置回过滤器(结束),以便$ shuffled返回整个对象而不仅仅是它的一个子集?

这是我使用的随机码:

(function($){
    $.fn.shuffle = function() {

        var allElems = this.get(),
            getRandom = function(max) {
                return Math.floor(Math.random() * max);
            },
            shuffled = $.map(allElems, function(){
                var random = getRandom(allElems.length),
                    randEl = $(allElems[random]).clone(true)[0];
                allElems.splice(random, 1);
                return randEl;
           });

        this.each(function(i){
            $(this).replaceWith($(shuffled[i]));
        });

        return $(shuffled);
    };
})(jQuery);

2 个答案:

答案 0 :(得分:1)

好的,我自己找到了一个简单的解决方案。我没有意识到.add()正是我所寻找的。这就是现在的样子:

var $slides = $('.slide');
var $firstSlide = $slides.slice(0,1);
var $remainingSlides = $slides.slice(1).shuffle();

$slides = $firstSlide.add($remainingSlides);

不如单行,但至少相当可读。

答案 1 :(得分:0)

评论者是对的,我不相信end()正在做你期望它做的事。

这是我的解决方案,它可能已经过优化,但它完成了手头的请求。

var $shuffled = [];
var allSlides = $('.slide');
var $first = allSlides.first();
$shuffled.push($first);
var $rest = allSlides.slice(1).shuffle().each(function(){
    $shuffled.push($(this));    
});

这是一个测试解决方案的http://jsfiddle.net/gndgo6us/1/

的JSFiddle

在连续运行中,您可以看到HTML更改以显示混洗。