【问题标题】:Radomize order of <li> elements but group them by classes随机化 <li> 元素的顺序,但按类对它们进行分组
【发布时间】:2019-12-28 18:26:29
【问题描述】:

我正在寻找一种方法来使用 jQuery 随机化 &lt;li&gt; 列表的顺序,但将它们按类分组。因此,如果我有 3 个级别的 &lt;li&gt;,我希望它们以随机顺序出现在我的 &lt;ul&gt; 中,但同时将最高级别(由其类定义)的 &lt;li&gt; 保持在顶部,然后将第二高组也以随机顺序排列,依此类推。

我已经设法使用一个函数来随机重新排序项目,但无法按级别对它们进行分组。我的jQuery知识很基础。

随机排序前的示例代码

<ul id="myList">
    <li class="level3"><a href="">Link #1</a></li>
    <li class="level3"><a href="">Link #2</a></li>
    <li class="level3"><a href="">Link #3</a></li>

    <li class="level2"><a href="">Link #4</a></li>
    <li class="level2"><a href="">Link #5</a></li>
    <li class="level2"><a href="">Link #6</a></li>
    <li class="level2"><a href="">Link #7</a></li>

    <li class="level1"><a href="">Link #8</a></li>
    <li class="level1"><a href="">Link #9</a></li>
    <li class="level1"><a href="">Link #10</a></li>
    <li class="level1"><a href="">Link #11</a></li>
    <li class="level1"><a href="">Link #12</a></li>
</ul>

已编辑:这是我用来随机排序的脚本

var items = $("#myList > li");
for(var i = 0; i < items.length; i++){
    var target = Math.floor(Math.random() * items.length -1) + 1;
    var target2 = Math.floor(Math.random() * items.length -1) +1;
    items.eq(target).before(items.eq(target2));
}

我希望随机生成类似这个订单的东西。

<ul id="myList">
    <li class="level3"><a href="">Link #3</a></li>
    <li class="level3"><a href="">Link #1</a></li>
    <li class="level3"><a href="">Link #2</a></li>

    <li class="level2"><a href="">Link #6</a></li>
    <li class="level2"><a href="">Link #4</a></li>
    <li class="level2"><a href="">Link #7</a></li>
    <li class="level2"><a href="">Link #5</a></li>

    <li class="level1"><a href="">Link #10</a></li>
    <li class="level1"><a href="">Link #12</a></li>
    <li class="level1"><a href="">Link #9</a></li>
    <li class="level1"><a href="">Link #8</a></li>
    <li class="level1"><a href="">Link #11</a></li>
</ul>

【问题讨论】:

  • 请添加执行随机化的代码,然后我们将能够建议如何改进它以进行分组
  • 在 OP 上添加脚本

标签: jquery list random


【解决方案1】:

你几乎在那里。您现在需要的唯一更改是逐级考虑项目,而不是一起考虑。您可以通过根据包含特定数字的类过滤它们来做到这一点。例如:

var items = $("#myList > li[class*=3]");

只会找到类名包含 3 的项目,在您的示例中,这将是所有“级别 3”项目。当你洗牌时,其余部分保持不变。

因此,总体而言,您需要迭代这些级别,并分别对每个级别进行洗牌。类似的东西:

var levels = ['1', '2', '3']
levels.forEach(function(level) {
  var items = $("#myList > li[class*=" + level + "]");
  for(var i = 0; i < items.length; i++){
      var target = Math.floor(Math.random() * items.length -1) + 1;
      var target2 = Math.floor(Math.random() * items.length -1) +1;
      items.eq(target).before(items.eq(target2));
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="banner-message">
<ul id="myList">
    <li class="level3"><a href="">Link #1</a></li>
    <li class="level3"><a href="">Link #2</a></li>
    <li class="level3"><a href="">Link #3</a></li>

    <li class="level2"><a href="">Link #4</a></li>
    <li class="level2"><a href="">Link #5</a></li>
    <li class="level2"><a href="">Link #6</a></li>
    <li class="level2"><a href="">Link #7</a></li>

    <li class="level1"><a href="">Link #8</a></li>
    <li class="level1"><a href="">Link #9</a></li>
    <li class="level1"><a href="">Link #10</a></li>
    <li class="level1"><a href="">Link #11</a></li>
    <li class="level1"><a href="">Link #12</a></li>
</ul>
</div>

【讨论】:

  • 非常感谢安德烈。它按预期工作。这正是我正在寻找的快速解决方案。你真的帮助我比我一个人更快地到达那里。谢谢
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
相关资源
最近更新 更多