使用 javascript/jquery 根据随机打乱的数组显示 div

Show div's based on a randomly shuffled array using javascript/jquery

本质上,我正在尝试编写一个 Javascript/Jquery 脚本,该脚本将 show/hide 多个 div 一次一个,顺序由一系列随机打乱的数字。

我已经设法让脚本随机排列数字并在 div 中循环工作,但我不确定如何将两者结合起来。

目前的脚本如下所示

$(document).ready(function() {

    function shuffle(arra1) {
        var ctr = arra1.length, temp, index;

        // While there are elements in the array
        while (ctr > 0) {
            // Pick a random index
            index = Math.floor(Math.random() * ctr);
            // Decrease ctr by 1
            ctr--;
            // And swap the last element with it
            temp = arra1[ctr];
            arra1[ctr] = arra1[index];
            arra1[index] = temp;
        }

        return arra1;
    }

    var myArray = [0, 1, 2, 3, 4, 5];
    console.log(shuffle(myArray));

    var divs = $('div[id^="random"]').hide(),
        i = 0;

    (function cycle() { 
        divs.eq(i).fadeIn(400)
                  .delay(1000)
                  .fadeOut(400, cycle);

        i = ++i % divs.length;
    })();
});

我试图在 HTML 中循环的 div 看起来像这样

<div id="random-divs">
    <div id="random0">Div 0</div>
    <div id="random1">Div 1</div>
    <div id="random2">Div 2</div>
    <div id="random3">Div 3</div>
    <div id="random4">Div 4</div>
    <div id="random5">Div 5</div>
</div>

如果有人能指出正确的方向,我将不胜感激。

最简单的更改是将 divs.eq(i) 替换为 divs.eq(myArray[i]),同时考虑到打乱的位置。

但是,与其用索引打乱数组,不如用元素本身打乱数组通常更容易理解:

var divs = $('div[id^="random"]').hide().toArray()
    i = 0;
shuffle(divs);

(function cycle() { 
    $(divs[i]).fadeIn(400)
              .delay(1000)
              .fadeOut(400, cycle);

    i = ++i % divs.length;
})();

您甚至可能不需要 toArray$(divs[i]),您的 shuffle 函数足够通用,也可以处理 jQuery 集合。

尝试更新 jQuery 选择器 "div[id^="random]" 因为它也会影响 ID 为 "random-divs" 的容器 div。我想你不想隐藏容器div 但只是它的孩子。

$(document).ready(function() {

    function shuffle(arra1) {
        var ctr = arra1.length, temp, index;

        // While there are elements in the array
        while (ctr > 0) {
            // Pick a random index
            index = Math.floor(Math.random() * ctr);
            // Decrease ctr by 1
            ctr--;
            // And swap the last element with it
            temp = arra1[ctr];
            arra1[ctr] = arra1[index];
            arra1[index] = temp;
        }

        return arra1;
    }

    var myArray = [0, 1, 2, 3, 4, 5];
    var shuffledArray = shuffle(myArray);
    console.log(shuffledArray);
    var divs = $('div[id^="random"]');
    
    (function cycle() { 
        var i = shuffledArray.shift();
        if(i === undefined){
          return
        }
        divs.eq(i).fadeIn(400)
                  .delay(1000)
                  .fadeOut(400, cycle);

      
    })();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="random-divs">
    <div style='display:none;' id="random0">Div 0</div>
    <div style='display:none;' id="random1">Div 1</div>
    <div style='display:none;' id="random2">Div 2</div>
    <div style='display:none;' id="random3">Div 3</div>
    <div style='display:none;' id="random4">Div 4</div>
    <div style='display:none;' id="random5">Div 5</div>
</div>