【问题标题】:Wrap li items for each section met为遇到的每个部分包装 li 项目
【发布时间】:2019-09-17 21:47:21
【问题描述】:

我想知道是否可以在每次 li 项具有类 .gsection 时将我的列表项包装到 ul 中?所以我想寻找 li.gsection 标签,然后它们会包装所有项目,直到找到下一个 li.gsection。 ul 包装器还应该添加两个类,其中一个是动态的。 li.gsection 始终是第二个类名,而我的添加类始终是第三个。

我在 wordpress 中使用重力形式,所以我无法编辑 html 标记。

如果我需要更多地解释自己,请告诉我。

我现在拥有的:

<ul class="myList">
  <li class="gfield gsection contactInfo otherClassesIsAdded">Contact Info</li>
  <li>Number</li>
  <li>Mail</li>
  <li class="gfield gsection contactInfo otherClassesIsAdded">Company info</li>
  <li>Company name</li>
  <li>Mail</li>
  <li class="gfield gsection contactInfo otherClassesIsAdded">Extra Info</li>
  <li>URL</li>
  <li>Notes</li>
</ul>



<ul class="myList">
   <li class="gsectionWrapper contactInfoWrapper">
     <ul>
      <li class="gfield gsection contactInfo otherClassesIsAdded">Contact Info</li>
      <li>Number</li>
      <li>Mail</li>
    </ul>
  </li>
  <li class="gsectionWrapper companyInfoWrapper">
    <ul>
      <li class="gfield gsection companyInfo otherClassesIsAdded">Company info</li> 
      <li>Company name</li>
      <li>Mail</li>
    </ul>
  </li>
  <ul>
  <li class="gsectionWrapper extraInfoWrapper">
    <ul>
      <li class="gfield gsection contactInfo otherClassesIsAdded">Extra Info</li>
      <li>URL</li>
      <li>Notes</li>
    </ul>
  </li>
</ul>

【问题讨论】:

  • ul 不能有 ul 作为孩子。那是无效的 HTML。
  • 然后我将编辑为 li.. 没关系,这是我的问题所在的功能。但感谢通知
  • 它需要更多:如果你只是编辑到li,你也会得到无效的HTML,因为li不能有li作为孩子。
  • @trincot - 我现在应该知道了 :) - 你对这个问题有什么想法吗?

标签: javascript jquery


【解决方案1】:

一旦识别出一组li 元素,就可以使用jQuery wrapAll 函数。为了识别这些,我建议迭代 .gfield 元素,然后抓取所有下一个(使用nextAll),直到遇到下一个.gfield(或列表末尾):

var $allFields = $("ul li.gfield");
$allFields.each(function (i) {
    var $group = $(this).nextAll("li").addBack();
    if (i < $allFields.length - 1) {
        $group = $group.slice(0, $group.index($allFields.get(i+1)));
    }
    var className = $(this).attr('class').match(/\b\w+Info\b/) || "";
    $group.wrapAll("<li class='gsectionWrapper " + className + "Wrapper'><ul>");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class="myList">
  <li class="gfield gsection contactInfo otherClassesIsAdded">Contact Info</li>
  <li>Number</li>
  <li>Mail</li>
  <li class="gfield gsection companyInfo otherClassesIsAdded">Company info</li>
  <li>Company name</li>
  <li>Mail</li>
  <li class="gfield gsection extraInfo otherClassesIsAdded">Extra Info</li>
  <li>URL</li>
  <li>Notes</li>
</ul>

【讨论】:

  • 酷! - 然后我只需要动态地从 li 中获取第三个类名:ex。 li.companyInfo,然后使用包装器扩展将其添加到最近的 li 中。 li.companyInfoWrapper.
  • 是的,我没有看到问题中解释的逻辑。就像extraInfoWrapper 一样:我看不出你会从哪里得到它,除了文本内容,但这不是最佳做法。
  • 解释也比较难,我一般都是用视频来解释。所有类名为 .gsection 的 li 标签 - 第三类始终是我个人添加的类。外汇。公司信息。因此,您在代码中拥有的 url 组应该从 li 标记中获取第三个类,然后使用 Wrapper 对其进行扩展。 - 更好?
  • 好的,但这不是您在第三部分的示例中所做的,它使用extraInfoWrapper 而不是contactInfoWrapper。最初所有三个字段都有contactInfo 作为类,但是在您的预期输出中,中间的字段突然有companyInfo。所以......我真的很困惑。
  • 无论如何,我用我认为你在做什么更新了答案。
【解决方案2】:

你可以使用$.children()$.each()

const list = $('#myList')
let wrapper;
list.children('li')
  .each(function(){
  const current = $(this)
  if(current.hasClass('gsection')){
    wrapper = $('<ul class="gsectionWrapper contactInfoWrapper"></ul>')
    list.append(wrapper)
  }
   list.detach(current)
   wrapper.append(current)
})
<ul id='myList' class="myList">
  <li class="gfield gsection contactInfo otherClassesIsAdded">Contact Info</li>
  <li>Number</li>
  <li>Mail</li>
  <li class="gfield gsection contactInfo otherClassesIsAdded">Company info</li>
  <li>Company name</li>
  <li>Mail</li>
  <li class="gfield gsection contactInfo otherClassesIsAdded">Extra Info</li>
  <li>URL</li>
  <li>Notes</li>
</ul>

这是一个工作示例https://codepen.io/medmor/pen/eYOLrBE

【讨论】:

  • 谢谢!而不是手动的contactInfoWrapper,是否可以获取第三个类名,然后将Wrapper添加到其中? - 有意义吗?
  • 是的。如果你总是类将用空格分隔```current.attr('class').split(' ')[2]``
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多