0

此代码在他们的示例中运行良好,但在我尝试使用它时会重复我的一些索引项。

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;

谁能告诉我这段代码中缺少什么以防止它重复我的数组中的项目?

4

2 回答 2

1

我不确定我是否完全理解您的页面是如何工作的,但似乎它正在对数组进行洗牌以找出要转到的下一页。这意味着它在每次页面加载时都会重新打乱,因此您无法保证页面的唯一性 - 事实上,您极不可能获得所有唯一页面(n 中的 1 个!,精确的)

为了确保唯一性,您必须保存生成的订单,而不仅仅是您所在的索引。

于 2013-10-23T17:46:20.130 回答
0

您的声明有问题,j并且temp可能会叠加多次洗牌并给您一些奇怪的行为。

特别是这一行:

var i = this.length, j, temp;

这些行:

j = Math.floor( Math.random() * (i - 1) );
temp = this[i];

这里的问题是您实际上并没有声明jandtemp变量,这是一种无效的语法。然后在没有var关键字的循环中声明它们时,它们被视为全局变量。可通过将第一行修改为:

var j, temp;
var i = this.length;

编辑:实际上不是这样,正如t.niese每次单击时已经指出的那样,tom您正在重新洗牌。

你想要做的是洗牌一次,每次都使用新洗牌的数组。arr.knuthShuffle();因此,通过取消该loadPages()功能,将您的洗牌与页面加载解耦。

于 2013-10-23T17:53:55.700 回答