【问题标题】:Jquery random/shuffle content amongst multiple columns?Jquery在多列中随机/随机播放内容?
【发布时间】:2012-09-07 07:49:42
【问题描述】:

我有一个三列布局,每列都有多个 div,其中包含相似内容的块:

<section class="info-blocks-container clearfix">
<div id="col1">
    <div class="info-block">...</div>
    <div class="info-block">...</div>
    <div class="info-block">...</div>
</div>
<div id="col2">
    <div class="info-block">...</div>
    <div class="info-block">...</div>
</div>
<div id="col3">
    <div class="info-block">...</div>
    <div class="info-block">...</div>
    <div class="info-block">...</div>
</div>
</section>

我想将 div#col1div#col2div#col3 中的子 div 随机排列在列中,因此 #col1 的一些子 div 最终会出现在 #col2 和/或 @ 987654328@,反之亦然。我正在使用 codeparadox 的 function reorder() 找到 here(我删除了“撤消”功能)并且洗牌正在工作,但是
1. 我有 3 个单独的重复函数的方式很脏,而且
2. 只对每列中的 div 进行排序(不共享三列中的子 div):

<script type="text/javascript">
$(function(){
    reorder();
    reorder2();
    reorder3();

    function reorder() {
        var grp = $(".info-blocks-container > div:nth-child(1)").children();
        var cnt = grp.length;

        var temp, x;
        for (var i = 0; i < cnt; i++) {
            temp = grp[i];
            x = Math.floor(Math.random() * cnt);
            grp[i] = grp[x];
            grp[x] = temp;
        }
        $(grp).remove();
        $(".info-blocks-container > div:nth-child(1)").append($(grp));
    }
    function reorder2() {
        var grp = $(".info-blocks-container > div:nth-child(2)").children();
        var cnt = grp.length;

        var temp, x;
        for (var i = 0; i < cnt; i++) {
            temp = grp[i];
            x = Math.floor(Math.random() * cnt);
            grp[i] = grp[x];
            grp[x] = temp;
        }
        $(grp).remove();
        $(".info-blocks-container > div:nth-child(2)").append($(grp));
    }
    function reorder3() {
        var grp = $(".info-blocks-container > div:nth-child(3)").children();
        var cnt = grp.length;

        var temp, x;
        for (var i = 0; i < cnt; i++) {
            temp = grp[i];
            x = Math.floor(Math.random() * cnt);
            grp[i] = grp[x];
            grp[x] = temp;
        }
        $(grp).remove();
        $(".info-blocks-container > div:nth-child(3)").append($(grp));
    }
});
</script>

有什么建议吗?

【问题讨论】:

    标签: jquery shuffle multiple-columns


    【解决方案1】:

    其次,您的问题对我来说确实是一个挑战。但我想我找到了一个解决方案:

    var columnsCollection = new Array();
    var columnsObjectsNumber = new Array();
    
    reorder();
    function reorder() {
        $(".info-blocks-container").find("DIV[id^='col']").each(function()
        {           
            var tmp = $(this).children();
            //Store the numbers of contained children
            columnsObjectsNumber.push($(tmp).size());
            $(tmp).each(function()
            {
                //transfers current child object to our global store place
                columnsCollection.push($(this));
                //and removed it
                $(this).remove();
            });
        });
    
        var restartIndex = 0;
        $(".info-blocks-container").find("DIV[id^='col']").each(function()
        {
            //Contains the random generated number
            var x;
            //Contains the current object with Id 'col..'
            var temp = $(this);
            for (var i = 0; i < columnsObjectsNumber[restartIndex]; i++)
            {
                /*
                  Generates a random number.
                 The maximum limit is the current length from our global store place
                */
                x = Math.floor(Math.random() * columnsCollection.length);
                //Appends the object to the current object with Id 'col..'
                $(temp).append(columnsCollection[x]);
                //Removes the appended element from global store place
                columnsCollection.splice(x,1);
             }
            restartIndex++;
        });   
    }
    

    它看起来并不专业,但它确实有效。希望这是您的要求...

    【讨论】:

    • 男人。像魅力一样工作!非常感谢
    【解决方案2】:

    起初,您不需要看起来相似的三个函数。您可以只使用一种方法进行投射:

    reorder();
    function reorder(columnObject) {
        $(".info-blocks-container").find("DIV[id^='col']").each(function()
        {
            var grp = $(this).children();
            var cnt = grp.length;
            var temp, x;
            for (var i = 0; i < cnt; i++)
            {
                temp = grp[i];
                x = Math.floor(Math.random() * cnt);
                grp[i] = grp[x];
                grp[x] = temp;
             }
             $(grp).remove();
             $(this).append($(grp));  
        });
    }
    

    【讨论】:

    • 这太好了,非常感谢!一旦我有机会进行全面测试,我会将其中一个标记为答案
    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2014-04-02
    • 2012-03-11
    • 2014-09-09
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多