【问题标题】:Wrap/Break List elements by replace text to class通过将文本替换为类来换行/断开列表元素
【发布时间】:2016-06-26 20:39:25
【问题描述】:

我的问题是如何通过从列表项文本中添加类查找来包装/中断列表项,例如下面的示例?
我的相关问题在这里:Wrap List elements by class name

Fiddle link

<div class="widget-content">
    <ul>
        <li><span class="label"> demo-text1 </span> Test Content</li>
        <li><span class="label"> demo-text2 </span> Test Content</li>
        <li><span class="label"> demo-text1 </span> Test Content</li>

        <li><span class="label"> demo-text2 </span> Test Content</li>
        <li><span class="label"> demo-text1 </span> Test Content</li>
        <li><span class="label"> demo-text2 </span> Test Content</li>
    </ul>
</div>

我想打破这样的列表项:

<div class="widget-content">
    <ul class="demo-text1">
        <li><span class="label"> demo-text1 </span> Test Content</li>
        <li><span class="label"> demo-text1 </span> Test Content</li>
        <li><span class="label"> demo-text1 </span> Test Content</li>

    </ul> <!-- Break part 1 -->

    <ul class="demo-text2">
        <!-- Break part 2 -->
        <li><span class="label"> demo-text2 </span> Test Content</li>
        <li><span class="label"> demo-text2 </span> Test Content</li>
        <li><span class="label"> demo-text2 </span> Test Content</li>
    </ul>
</div>

我的意思是像第二个 HTML 示例那样将列表项分为两部分。通过替换上面给出的class="label"example(第二个HTML)中的文本,将类添加到父ul

我怎样才能简单地通过 jQuery/JS 做到这一点?这是我尝试过的:

$(".widget-content").each(function() {
    var $li = $(this).find("li").unwrap(); // unwrap removes the old UL wrapper
    var uniq = [];

    // Create a collection of unique "label*" classes:
    $li.find("[class^=label]").attr("class", function(i, v) {
        if (!~$.inArray(v, uniq)) uniq.push(v);
    });
    // Group LI by A class, and wrap into a new UL with the same class
    $.each(uniq, function(i, klas) {
        $("a." + klas).closest("li").wrapAll($("<ul/>", {
            class: klas
        }));
    });
});

提前致谢。

【问题讨论】:

  • 无论li 有多少,您总是希望将列表分成两个,还是要将其分成多个组,每组 3 个?另外,请添加您自己编写的JS代码来解决问题。
  • becz,我正在学习 JS,我一直在练习,这是我的尝试:jsfiddle.net/yn60j368/1
  • 没关系,我们都还在学习中。它只是帮助人们在看到您尝试解决问题的方式以及您的代码中是否有任何可以轻松修复的错误时回答您的问题。
  • 是的,来自class="label"的多个文本组,意味着如果class="label"上有不同的文本,请创建新组。我的意思是只有在class="label" 上有不同的文字时才拆分,希望你理解:-)

标签: javascript jquery html replace


【解决方案1】:

您可以使用.each()$.each().html().text().trim()

var arr = []; // array to store `li` elements
var widget = $(".widget-content");

$(".widget-content li").each(function(index, el) {
  var html = el.outerHTML;
  // number at `label` text
  var curr = $(".label", this).text().trim().slice(-1);
  if (arr[curr - 1]) {
    arr[curr - 1].push(html)
  } else {
    arr[curr - 1] = [html];
  }
});

widget.html(""); // remove existing `html`

$.each(arr, function(key, val) {
  var li = val.join("");
  $(".widget-content").append($("<ul/>", {
    html: li,
    "class":$(li).eq(0).find(".label").text().trim()
  }))
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="widget-content">
  <ul>
    <li><span class="label"> demo-text1 </span> Test Content</li>
    <li><span class="label"> demo-text2 </span> Test Content</li>
    <li><span class="label"> demo-text1 </span> Test Content</li>

    <li><span class="label"> demo-text2 </span> Test Content</li>
    <li><span class="label"> demo-text1 </span> Test Content</li>
    <li><span class="label"> demo-text2 </span> Test Content</li>
  </ul>
</div>

【讨论】:

  • 很好,但是试图通过 class="label" 类中的文本将类添加到父类 ul,我的意思是在 class="label" 上找到文本,然后将文本替换为类,然后将此类添加到每个父类ul
  • 有 6 个 li 项目,为什么是 4 个列表?我正在尝试将列表项分组到 demo-text1demo-text2ul
  • 请检查我的第二个 HTML 示例,我想要这个输出。
猜你喜欢
  • 2018-10-10
  • 2014-06-12
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
相关资源
最近更新 更多