You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用原生JavaScript将带有特定前缀的列表元素移动到对应目标元素

原生JavaScript实现列表层级转换方案

实现逻辑

  • 约定列表项匹配前缀为*,可自定义修改
  • 遍历目标ul的所有直接子li,识别带指定前缀的列表项
  • 连续的前缀列表项会被自动归入最近的、不带前缀的前置li下,作为其子列表

完整代码

/**
 * 处理列表层级转换
 * @param {HTMLElement} rootUl 要处理的根ul元素
 * @param {string} prefix 匹配的前缀符号,默认是*
 */
function processNestedList(rootUl, prefix = '*') {
  const firstLevelLis = Array.from(rootUl.children).filter(el => el.tagName === 'LI');
  // 记录当前可归属的父li和对应的子ul
  let activeParentLi = null;
  let activeSubUl = null;

  firstLevelLis.forEach(li => {
    const trimText = li.textContent.trimStart();
    if (trimText.startsWith(prefix)) {
      // 没有可归属的父li时不处理
      if (!activeParentLi) return;
      // 没有子ul则先创建
      if (!activeSubUl) {
        activeSubUl = document.createElement('ul');
        activeParentLi.appendChild(activeSubUl);
      }
      // 移动节点到子ul
      activeSubUl.appendChild(li);
    } else {
      // 遇到非前缀项,重置当前父级容器
      activeParentLi = li;
      activeSubUl = null;
    }
  });
}

使用示例

给你要处理的ul添加id标识:

<ul id="myList">
  <li>one</li>
  <li>two</li>
  <li>*three</li>
  <li>*fore</li>
  <li>*five</li>
  <li>six</li>
  <li>saven</li>
  <li>*aite</li>
  <li>*nine</li>
  <li>ten</li>
</ul>

页面加载完成后调用处理方法即可:

document.addEventListener('DOMContentLoaded', () => {
  const targetList = document.getElementById('myList');
  // 传入要处理的ul和自定义前缀,这里用默认的*
  processNestedList(targetList);
});

注意事项

  • 连续前缀项如果前面没有非前缀的父li,会保留在原位置,避免出现无归属的DOM结构错误
  • 该方法直接移动原有DOM节点,会保留li上原有的类名、样式、事件绑定等属性
  • 可以通过第二个参数自定义匹配前缀,比如要匹配#开头的项,调用时传入processNestedList(targetList, '#')即可

内容的提问来源于stack exchange,提问作者محمد امين

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:21:00