javascript - 如何重建DOM?

标签 javascript dom

加载后我需要更改页面。
源结构在这里:

<div id='content'>
  <h1>...</h1>
  <p>...</p>
  <h1>...</h1>
  <p>...</p>
  <h1>...</h1>
  <p>...</p>
</div>

我需要将其重建为这个:

<div id='content'>
  <div>
    <div>
      <h1>...</h1>
      <div>
        <p>...</p>
      </div>
    </div>
  </div>
 
  <div>
    <div>
      <h1>...</h1>
      <div>
        <p>...</p>
      </div>
    </div>
  </div>
 
  <div>
    <div>
      <h1>...</h1>
      <div>
        <p>...</p>
      </div>
    </div>
  </div>
</div>

这是我的算法:

const createComplexNode = () => {
  const parentBlock = document.querySelector('#content')
  const parentContent = parentBlock.querySelectorAll('h1, p')
 
  if (parentContent.length === 0) return
 
  const mainNode = document.createElement('div')
  const titleNode = document.createElement('div')
  const bodyNode = document.createElement('div')
  mainNode.className = 'desc-container'
  titleNode.className = 'desc-head'
  bodyNode.className = 'desc-body'
 
  const indexes = getIndex(parentContent)
 
  console.log(parentContent[indexes.start])
 
  titleNode.appendChild(parentContent[indexes.start])
 
  for (let i = 1; i <= indexes.end; i++) {
    bodyNode.appendChild(parentContent[i])
  }
 
  mainNode
    .appendChild(titleNode)
    .appendChild(bodyNode)
 
  parentBlock.appendChild(mainNode)
  return createComplexNode()
}
 
const getIndex = nodeList => {
  const indexes = {
    start: -1,
    end: -1,
  }
 
  const regex = new RegExp('h?')
 
  for (let i = 0; i < nodeList.length; i++) {
    if (regex.test(nodeList[i].localName) && indexes.start < 0) {
      indexes.start = i
    }
    if (nodeList[i].localName === 'p') {
      indexes.end = i
      break
    }
  }
  return indexes
}

我的主要问题在这里constparentContent =parentBlock.querySelectorAll('h1, p')
它工作正常,但仅限于第一个周期。因为,这个函数捕获父节点中的所有标签以及已经包装的元素。这是因为无限递归。我该如何预防?

最佳答案

使用一些用于查询和创建 DOM 元素的实用函数,以及 .append() 方法:

// DOM Utility functions:

const EL = (sel, el) => (el || document).querySelector(sel);
const ELS = (sel, el) => (el || document).querySelectorAll(sel);
const ELNew = (tag, prop) => Object.assign(document.createElement(tag), prop);

// Recreate DOM:

const EL_content = EL("#content");
const ELS_h1 = ELS("h1", EL_content);

ELS_h1.forEach(EL_h1 => {

  const EL_div_outer = ELNew("div", {className: "wrapper-outer"});
  const EL_div_inner = ELNew("div", {className: "wrapper-inner"});
  const EL_div_parag = ELNew("div", {className: "wrapper-parag"});
  const EL_p = EL_h1.nextElementSibling;

  EL_div_outer.append(EL_div_inner);
  EL_div_inner.append(EL_h1, EL_div_parag);
  EL_div_parag.append(EL_p);
  EL_content.append(EL_div_outer);

});
div { padding: 10px; background: rgba(0,0,0, 0.1); }
<div id="content">
  <h1>Title 1</h1>
  <p>Paragraph 1</p>
  <h1>Title 2</h1>
  <p>Paragraph 2</p>
  <h1>Title 3</h1>
  <p>Paragraph 3</p>
</div>

工作原理:

代码非常简洁、干净,并且应该是不言自明的。

关于javascript - 如何重建DOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70526087/

相关文章:

javascript - 具有动态内容的完全加载 DOM 的 jQuery 事件监听器

java - 优化 DOM 和 XPath Java 代码

javascript - 多人游戏中对手的移动 promise

javascript - Bootstrap 导航栏子菜单事件状态不起作用

javascript - 事件绑定(bind)方法和性能 $(document).on ("click", "#id", fn) VS $ ("#id").on ("click", fn)

java - 如何用java删除XML节点

javascript - Windows Phone 7 和 IE DOM 性能

javascript - 使用下拉选择器更改/覆盖 PHP 变量

javascript - 谷歌地图中心不稳定

javascript - 在事件目标上添加 css tilde 从 element1 到 element2