【问题标题】:Adding different class for every six list item using jQuery使用 jQuery 为每六个列表项添加不同的类
【发布时间】:2014-11-11 15:44:33
【问题描述】:

我正在尝试使用 jQuery 为每六个列表项添加一个不同的类。

我试过查看.append().after(),但我不确定使用它们的逻辑。

我将如何通过 JQuery 实现以下结构:

<ul>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
</ul>

我还想在单击按钮时将具有相同类别的六个项目组移动到列表顶部。

脚本:

$('button').on('click', function(){
   $('ul li.blue').append($('ul li:nth-child(2)'));
});

【问题讨论】:

  • 这些类是在哪里定义的?您的最终目标不是 100% 明确
  • 这看起来像是 .prepend() 的工作!

标签: jquery


【解决方案1】:

您可以使用slice()方法如下:

var colors = ["white", "blue", "red"];
var $listItems = $("li");
$.each(colors, function(i, color) {
  $listItems.slice(i * 6, ++i * 6).addClass(color);
  $("body").append($("<button/>", {
    text: color,
    css: {
      "background-color": color
    }
  }))
});

var colors = ["white", "blue", "red"];
var $listItems = $("li");
$.each(colors, function(i, color) {
  $listItems.slice(i * 6, ++i * 6).addClass(color);
  $("body").append($("<button/>", {
    text: color,
    css: {
      "background-color": color
    }
  }))
});

$('button').on('click', function() {
  $('ul li.' + $(this).text()).prependTo('ul');

});
ul {
  list-style-type: none;
}
li {
  width: 100px;
  height: 20px;
  border: 1px solid;
}
.white {
  background: #fff;
}
.blue {
  background: dodgerblue;
}
.red {
  background: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li>white</li>
  <li>white</li>
  <li>white</li>
  <li>white</li>
  <li>white</li>
  <li>white</li>
  <li>blue</li>
  <li>blue</li>
  <li>blue</li>
  <li>blue</li>
  <li>blue</li>
  <li>blue</li>
  <li>red</li>
  <li>red</li>
  <li>red</li>
  <li>red</li>
  <li>red</li>
  <li>red</li>
</ul>

更新

根据您的评论,您可以使用map() 方法从data() 属性中提取颜色,例如:

var colors = $("div").map(function(){
  return $(this).data("color");
});

您可以使用 jQuery each() 方法迭代我们提取的颜色数组。

在每次迭代中,我们创建一个新的&lt;li&gt;,其文本和类与被迭代的颜色相同。

然后我们通过将我们创建的示例&lt;li&gt;outerHTML 传递给数组join() 方法来创建一个对应于n 数量的HTMLString,例如:

new Array(7).join($li.get(0).outerHTML);

然后我们将append() 这个HTMLString&lt;ul&gt;,还创建一个按钮,prepend() 是一组与&lt;li&gt; 相似的&lt;li&gt;&lt;ul&gt;,以便将它们放在列表的顶部.


var colors = $("div").map(function() {
  return $(this).data("color");
});
var $ul = $("ul"),
  $body = $("body");
$.each(colors, function(i, color) {
  var $li = $("<li/>", {
    text: color,
    class: color
  });
  $ul.append(new Array(7).join($li.get(0).outerHTML));
  $body.append($("<button/>", {
    text: color,
    css: {
      "background-color": color
    },
    on: {
      click: function() {
        $('ul li.' + $(this).text()).prependTo('ul');
      }
    }
  }));
});
ul {
  list-style-type: none;
}
li {
  width: 100px;
  height: 20px;
  border: 1px solid;
}
.white {
  background: #fff;
}
.blue {
  background: dodgerblue;
}
.red {
  background: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-color="white"></div>
<div data-color="blue"></div>
<div data-color="red"></div>
<ul>
</ul>

附注:如果您想为按钮设置不同的文本,可以将数据保存为data-* 属性并使用它来查找相应的组。

另外,为了演示,我添加了 CSS 类,您应该在创建 &lt;li&gt; 时应用 css,因为动态执行此操作时使用预定义的 CSS 类是不切实际的。

【讨论】:

  • 太棒了,谢谢大家!我喜欢这个解决方案,因为我需要从数据属性中获取颜色,所以我需要将它们放在与此类似的数组中。你能给我一个指针,告诉我如何从像
    这样的 div 中获取颜色吗?谢谢!
  • 我知道您已经根据数组中的颜色动态创建了按钮,但我已经准备好这些按钮(样本)(来自另一个数据源)。你能告诉我如何使用你的代码,但没有生成按钮,所以我仍然使用点击功能吗?谢谢!
  • @casiokid 您的按钮与特定组有何关系..? id/class/data 属性,或文本..?第一个 sn-p 包含一个基于按钮文本的演示...
  • 它们通过数据属性 data-color="" 相关联,因此您的地图函数会从这些按钮/div 中获取所有颜色。
【解决方案2】:

这是你要找的吗?

FIDDLE

你想.prepend()你的li

HTML

<button id="white">Move White</button><button id="blue">Move Blue</button><button id="red">Move Red</button>
<ul>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="white">white</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="blue">blue</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
  <li class="red">red</li>
</ul>

JS

$('button').click(function(e) {
    var color = $(this).prop('id');
    var $lis = $('li.' + color);
    $lis.remove();
    for (var i = 0; i < $lis.length; i++) {
        $('ul').prepend('<li class="' + color + '">' + color + '</li>');
    }        
});

CSS

li {
    padding: 10px;
    list-style: none;
}

.white {
    background-color: lightgray;
}

.blue {
    background-color: lightblue;
}

.red {
    background-color: pink;
}

更新

我更新为使用可变数量的元素。

【讨论】:

  • 感谢您的快速响应,这几乎就是我想要的!抱歉,我没有提供足够的信息。而不是一个按钮,我有 3 个颜色按钮,当我单击颜色按钮时,具有该类的列表项需要移动到列表的顶部。即当我单击“蓝色”时,蓝色移动到列表顶部(从中间位置)。谢谢!
  • 太好了,非常感谢!作为上面的另一个解决方案,我需要从数据属性中动态获取这些颜色(所以
    )。您知道将其与您的解决方案集成的最佳方法是什么吗?再次感谢
  • 是的,但我需要更多信息。您是否使用父 div 中的颜色动态生成 li 标签?一个 div 是否具有所有颜色?
【解决方案3】:

像这样:

http://jsfiddle.net/CaseyRule/vkgrozj8/3/

$('input').click( function(e) {
    var c = $(e.target).val();
    $('ul').find('.'+c).each( function( index, element ) {
        console.log(element);
        $('ul').prepend(element);
    });
});

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签