在一个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);
答案 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更改以显示混洗。