代码之家  ›  专栏  ›  技术社区  ›  Chris

是否可以在多个div元素中洗牌内容

  •  4
  • Chris  · 技术社区  · 16 年前

    <div>

    <div id='d1'>
      <span>alpha</span>
      <img src='alpha.jpg'>
    </div>
    <div id='d2'>
      <span>beta</span>
      <img src='beta.jpg'>
    </div>
    <div id='d3'>
      <span>gamma</span>
      <img src='gamma.jpg'>
    </div>
    
    <button onclick='shuffle_content();'>Shuffle</button>
    

    单击按钮后,我希望d1、d2、d3中的内容可以改变位置(例如,可能d3会是第一个,然后是d1,然后是d2)。

    一种快速移动东西的方法是复制第一个div元素(d1),然后将其放在最末尾(在d3之后),然后删除原始的d1。但这并不是随机的。它只是让事情在循环中进行(这可能还可以)。

    7 回复  |  直到 16 年前
        1
  •  21
  •   Owen Ryan Doherty    16 年前

    您可以使用像这样的javascript库吗 jQuery

    <div id="shuffle">
        <div id='d1'>...</div>
        <div id='d2'>...</div>
        <div id='d3'>...</div>
    </div>
    

    和javascript:

    function shuffle(e) {               // pass the divs to the function
        var replace = $('<div>');
        var size = e.size();
    
        while (size >= 1) {
           var rand = Math.floor(Math.random() * size);
           var temp = e.get(rand);      // grab a random div from our set
           replace.append(temp);        // add the selected div to our new set
           e = e.not(temp); // remove our selected div from the main set
           size--;
        }
        $('#shuffle').html(replace.html() );     // update our container div with the
                                                 // new, randomized divs
    }
    
    shuffle( $('#shuffle div') );
    
        2
  •  18
  •   gilly3    13 年前

    要洗牌某个父元素的所有子元素,请选择一个随机子元素,并将其一次追加回父元素,直到所有子元素都被重新追加。

    使用jQuery:

    var parent = $("#shuffle");
    var divs = parent.children();
    while (divs.length) {
        parent.append(divs.splice(Math.floor(Math.random() * divs.length), 1)[0]);
    }
    

    演示: http://jsfiddle.net/C6LPY/2

    var parent = document.getElementById("shuffle");
    var divs = parent.children;
    var frag = document.createDocumentFragment();
    while (divs.length) {
        frag.appendChild(divs[Math.floor(Math.random() * divs.length)]);
    }
    parent.appendChild(frag);
    

    演示: http://jsfiddle.net/C6LPY/5/



    下面是代码的分解:

    // Create a document fragment to hold the shuffled elements
    var frag = document.createDocumentFragment();
    
    // Loop until every element is moved out of the parent and into the document fragment
    while (divs.length) {
    
        // select one random child element and move it into the document fragment
        frag.appendChild(divs[Math.floor(Math.random() * divs.length)]);
    }
    
    // appending the document fragment appends all the elements, in the shuffled order
    parent.appendChild(frag);
    
        3
  •  2
  •   hasen    16 年前

    您可以获取每个div的内容

    c1 = document.getElementById('div1').innerHTML
    c2 = document.getElementById('div2').innerHTML
    c3 = document.getElementById('div3').innerHTML
    

    然后随机为它们确定一个新的顺序。。然后将每个内容放入新的目的地

    c1_div = 'div2'
    c2_div = 'div1'
    c3_div = 'div3'
    

    那你就:

    document.getElementById(c1_div).innerHTML = c1
    document.getElementById(c2_div).innerHTML = c2
    document.getElementById(c3_div).innerHTML = c3
    
        4
  •  1
  •   Riccardo Porreca    6 年前

    nice answer 通过@gilly3,使用jQuery实际上可以避免添加随机选择的元素 divs 在循环中,通过 randomly sort ing div append

    $(function() {
      var parent = $("#shuffle");
      var divs = parent.children();
      divs.sort(function(a, b) {
        return 0.5 - Math.random();
      });
      parent.append(divs);
    });
    

    演示 http://jsfiddle.net/ey70Lxhk/

    但是请注意,该技术在随机性方面并不准确,并且依赖于 分类 它与元素的数量不成线性比例。

        5
  •  0
  •   Frank V    16 年前

    我将使用服务器端代码来实现这一点。我知道这不是你问题的答案,但是

    顺致敬意,
    直率的

        6
  •  0
  •   Owen Ryan Doherty    16 年前

    在那里,你可以创建一个新的div, cloning 以随机顺序填充包装器div的节点,然后 replace 包装器div包含新div。

        7
  •  0
  •   dlamblin    16 年前

    对于HTML,您的问题的简短答案是:

    function shuffle_content() {
     var divA = new Array(3);
     for(var i=0; i < 3; i++) {
      divA[i] = document.getElementById('d'+(i+1));
      document.body.removeChild(divA[i]);
     }
     while (divA.length > 0)
      document.body.appendChild(divA.splice(Math.floor(Math.random() * divA.length),1)[0]);
    }
    

    为了达到目的,我写了以下内容,我认为效果更好:

    <html>
    <div id="cards">
    <div id="card0">Card0</div><div id="card1">Card1</div>
    <div id="card2">Card2</div><div id="card3">Card3</div>
    <div id="card4">Card4</div><div id="card5">Card5</div>
    <div id="card6">Card6</div><div id="card7">Card7</div>
    <div id="card8">Card8</div><div id="card9">Card9</div>
    </div>
    <button id="shuffle">Shuffle</button>
    <script language="javascript">
    <!--
    document.getElementById('shuffle').onclick = function () {
    var divCards = document.getElementById('cards');
    var divCardsArray = new Array(
        document.getElementById('card0'),
        document.getElementById('card1'),
        document.getElementById('card2'),
        document.getElementById('card3'),
        document.getElementById('card4'),
        document.getElementById('card5'),
        document.getElementById('card6'),
        document.getElementById('card7'),
        document.getElementById('card8'),
        document.getElementById('card9')
        );
    return function() {
        var mDivCardsArray=divCardsArray.slice();
        while (divCards.childNodes.length > 0) {
            divCards.removeChild(divCards.firstChild);
        }
        while (mDivCardsArray.length > 0) {
            var i = Math.floor(Math.random() * mDivCardsArray.length);
            divCards.appendChild(mDivCardsArray[i]);
            mDivCardsArray.splice(i,1);
        }
        return false;
    }
    }()
    //-->
    </script>
    </html>
    

        while (mDivCardsArray.length > 0) {
            divCards.appendChild(
                mDivCardsArray.splice(
                    Math.floor(Math.random() * mDivCardsArray.length)
                    ,1)[0]
            );
        }
    

    但这很难理解,而且容易出错。

    就我个人而言,我认为如果你再增加两个div,效果会更好 cards divCardsArray ,插入以下样式块,并将此代码添加到 迪夫卡德萨雷 释义

    <html>
    ...
    <style>
    html,body{height:100%;width:100%;text-align:center;font-family:sans-serif;}
    #cards,#cards div{padding:5px;margin:5px auto 5px auto;width:100px;}
    </style>
    ...
    <div id="cardA">CardA</div><div id="cardB">CardB</div>
    ...
    var colorCardsArray = new Array(
        '#f00', '#f80', '#ff0', '#8f0', '#0f0', '#0f8',
        '#0ff', '#08f', '#00f', '#80f', '#f0f', '#f08' );
    for(var i=0;i<divCardsArray.length;i++)
        divCardsArray[i].style.backgroundColor=colorCardsArray[i];
    ...
    </html>
    
        8
  •  -1
  •   Nick    16 年前

    然后在页面加载上使用函数随机分配哪个div获得什么内容,并使用此函数更改div的内容:

    <script type="text/javascript">
        function ajaxManager(){
            var args = ajaxManager.arguments;
    
            if (document.getElementById) {
                var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
            }
            if (x){         
                switch (args[0]){
                    case "load_page":
                        if (x)
                        {
                            x.onreadystatechange = function()
                            {
                                if (x.readyState == 4 && x.status == 200){
                                    el = document.getElementById(args[2]);
                                    el.innerHTML = x.responseText;
                                }
                            }
                            x.open("GET", args[1], true);
                            x.send(null);
                        }
                        break;
    
                    case "random_content":
                        ajaxManager('load_page', args[1], args[2]); /* args[1] is the content page, args[2] is the id of the div you want to populate with it. */       
                        break;
                } //END SWITCH
            } //END if(x)
        } //END AjaxManager
    
    </script>