所以我的想法与 Eric 的想法相似,但我想让它“完全”发挥作用。因此,我没有将所有 div 的引用存储在一个数组中,而是决定存储一个表示每个 div 的整数数组。我最终使用 jQuery 选择它们的方式是"#lightbox + i"
,所以如果你没有这个确切的结构(其中 div 有一个像“lightbox”这样的 id 和一个 int - 从 1 到最后一个计数),那么你可以使用.eq()
or nth-child
。它不会是完全相同的结果,但它会产生相同的随机效果,只是以不同的方式完成。我找到了一个“随机化”数组的函数——我猜像 Eric 所做的Shuffle
那样。但这是我从中得到它的地方 -如何随机化(随机播放)JavaScript 数组?. 我不得不修改它以返回一个新数组,而不是修改传递给函数的数组。此外,我将所有内容都保留在document.ready
范围内,而不是全局范围内,因此很多东西都被传递/返回。当我在全球范围内声明并没有传递它们之前它工作得很好all
,randomed
我只是认为这会“更好”,因为它们不是全球性的。
这是小提琴:
http://jsfiddle.net/6qYCL/1/
这是Javascript:
$(document).ready(function () {
var all,
randomed;
all = generateAll();
randomed = generateRandomed(all);
$("#generator").on("click", function (evt) {
evt.preventDefault();
randomed = doNext(all, randomed);
});
});
function generateAll() {
// Generates the array of "all" divs to work on
var a = [];
var divs = $(".hide > div.lightbox");
for (var i = 1; i <= divs.length; i++) {
a.push(i);
}
console.log("List of divs available to toggle: " + a);
return a;
}
function generateRandomed(all) {
// Randomizes the original array
randomed = fisherYates(all);
console.log("Setting randomized array: " + randomed);
return randomed;
}
function doNext(all, randomed) {
$(".lightbox, #last-div").hide();
if (randomed.length < 1) {
console.log("All lightboxes toggled, showing last, then starting over");
$("#last-div").show();
randomed = generateRandomed(all);
} else {
var next = randomed.shift();
var selector = "#lightbox" + next;
console.log("Showing " + selector);
$(selector).show();
console.log("What's left: " + randomed);
}
return randomed;
}
// Randomizes an array and returns the new one (doesn't modify original)
function fisherYates ( myArray ) {
var return_arr = myArray.slice(0);
var i = return_arr.length;
if ( i == 0 ) return false;
while ( --i ) {
var j = Math.floor( Math.random() * ( i + 1 ) );
var tempi = return_arr[i];
var tempj = return_arr[j];
return_arr[i] = tempj;
return_arr[j] = tempi;
}
return return_arr;
}
它说明了到达列表的末尾并#new-div
像您提到的那样显示,然后重新开始该过程。如果您查看浏览器的控制台,您可以“观察”初始化期间和单击链接时发生的情况。
我认为这与您正在寻找的内容很接近。我不确定哪个是更好的解决方案 - 存储对元素的引用或只是一个整数数组以循环并最终找到。我知道如何做到这一点有很多变化 - 何时/如何存储计数的东西,何时/如何随机化数组或检索随机值(以及如何跟踪已使用的值),在哪里存储所有参考资料,还有更多。我希望这至少有帮助!