此代码在他们的示例中工作正常,但在我尝试使用它时会重复我的一些索引项。
var lastloaded = 0;
window.onload = loadPages;
Array.prototype.knuthShuffle = function()
{
var i = this.length, j, temp;
while ( --i )
{
j = Math.floor( Math.random() * (i - 1) );
temp = this[i];
this[i] = this[j];
this[j] = temp;
}
};
var arr = ["aCard.html", "bCard.html", "cCard.html", "dCard.html"];
function loadPages () {
arr.knuthShuffle();
var frame = document.getElementById("frameWrap");
if (lastloaded+1>arr.length){
lastloaded = window.location = "greatJob.html";
}
frame.src = arr[lastloaded];
lastloaded++;
};
document.getElementById('tom').onclick = loadPages;
任何人都可以告诉我这段代码中缺少什么,以防止它重复我的数组中的项目吗?
答案 0 :(得分:1)
我不确定我是否完全理解你的页面是如何工作的,但似乎它正在改组数组以便找出下一页要去的地方。这意味着每次加载页面时都会重新洗牌,因此您无法保证页面的唯一性 - 实际上,您最不可能获得所有唯一页面(n!中的1个!)精确)
为了确保唯一性,您必须保存生成的订单,而不仅仅是您所在的索引。
答案 1 :(得分:0)
您的 j
和temp
声明存在问题,这可能会导致多次混乱并给您一些奇怪的行为。
特别是这一行:
var i = this.length, j, temp;
和这些行:
j = Math.floor( Math.random() * (i - 1) );
temp = this[i];
这里的问题是您实际上没有声明j
和temp
变量,这是一种无效的语法。然后,在没有var
关键字的情况下在循环中声明它们时,它们将被视为全局变量。通过将第一行修改为:
var j, temp;
var i = this.length;
修改:实际上并非如此,正如t.niese每次点击tom
您已经重新洗牌时已经指出的那样。
你想要做的就是洗牌一次,每次都使用新洗牌的阵列。通过从arr.knuthShuffle();
函数中取出loadPages()
,可以将您的随机播放与页面加载分离。