如何动态创建嵌套元素?

问题描述 投票:11回答:3

我有这个字符串var arr = ["ul", "li", "strong", "em", "u"]数组。

如何将这些元素从左到右一个进入另一个内部,第一个元素作为根元素。由于某种原因没有使用ID。

也许通过使用循环可以灵活地使用任意数量的元素。

var new_element = document.createElement(arr[0]);

我期待这样的事情:

<ul>
    <li><strong><em><u>Text Here</u></em></strong></li>
</ul>

谢谢。

javascript html dom
3个回答
9
投票

您可以使用reduceRight()执行此操作,这样可以避免需要查询结果以获取最深的值,因为它从最深的元素开始并且可以解决。返回值将是最顶层的元素:

var arr = ["ul", "li", "strong", "em", "u"]

let el = arr.reduceRight((el, n) => {
  let d = document.createElement(n)
  d.appendChild(el)
  return d
}, document.createTextNode("Text Here"))

document.getElementById('container').appendChild(el)
<div id = "container"></div>

它也优雅地使用空数组:

var arr = []

let el = arr.reduceRight((el, n) => {
  let d = document.createElement(n)
  d.appendChild(el)
  return d
}, document.createTextNode("Text Here"))

document.getElementById('container').appendChild(el)
<div id = "container"></div>

12
投票

你可以使用Array.prototype.reduceNode.prototype.appendChild

https://jsbin.com/hizetekato/edit?html,js,output

var arr = ["ul", "li", "strong", "em", "u"];

function createChildren(mount, arr) {
  return arr.reduce((parent, elementName, i) => {
    const element = document.createElement(elementName);
    parent.appendChild(element);
    return element;
  }, mount);
}

const deepest = createChildren(document.querySelector('#root'), arr);

deepest.innerText = 'WebDevNSK'
<div id="root"></div>

0
投票

createDocumentFragment()并通过循环运行数组。在每次迭代createElement()appendChild()

const frag = document.createDocumentFragment();
const useless = ["ul", "li", "strong", "em", "u"];

let previous;
for (let u = 0; u < useless.length; u++) {
  const current = document.createElement(useless[u]);
  if (u === 0) {
    frag.appendChild(current);
  } else {
    previous.appendChild(current);
  }
  previous = current;
}

document.body.appendChild(frag);
ul {
  outline: 5px dashed green;
  padding: 15px;
}

li {
  outline: 5px solid blue;
  padding: 12px;
}

strong {
  outline: 5px dashed red;
  padding: 9px
}

em {
  outline: 5px dashed grey;
  padding: 6px
}

u {
  outline: 5px solid black;
  padding: 3px;
}

u::before {
  content: 'THIS TEXT SHOULD BE UNDERLINED'
}
© www.soinside.com 2019 - 2024. All rights reserved.