javascript - 使用 DOMParser 在每个 header 后添加 div 容器

标签 javascript domparser

带有字符串

<h1>aa</h1><p>xx</p><p>yy</p><h1>aaa</h1><p>xxx</p><p>yyy</p>

我试图在 header 之后插入一个 div 容器,将 header 的文本作为其 id 和内容 (下一个 header 之前的所有内容)在 header 之后,这样它就变成

<h1>aa</h1><div id="aa"><p>xx</p><p>yy</p></div><h1>aaa</h1><div id="aaa"><p>xxx</p><p>yyy</p></div>

到目前为止,这就是我所做的

let s = "<h1>aa</h1><p>xx</p><p>yy</p><h1>aaa</h1><p>xxx</p><p>yyy</p>";

const parser = new DOMParser();
const doc = parser.parseFromString(s, 'text/html');
const elems = doc.body.querySelectorAll('*');

[...elems].forEach(el => {
  if (el.textContent !== '' && el.tagName === 'H1') {    
    el.insertAdjacentHTML('afterend', `<div id='${el.textContent}' />`)
    // 
  }
});
  
console.log(doc.body.innerHTML);

是否有更简单的方法可以做到这一点,例如在标题后面添加一个开始 div 并在下一个标题之前添加一个结束 div ?我找不到太多这样的例子,Google 有更多 xml、php 或 java 使用 DOMParser

的例子

最佳答案

创建 DIV即时使用 Document.createElement() 并移动<P>元素使用 .appendChild()

let s = "<h1>aa</h1><p>xx</p><p>yy</p><h1>aaa</h1><p>xxx</p><p>yyy</p>";

const parser = new DOMParser();
const doc = parser.parseFromString(s, 'text/html');
const elems = doc.body.querySelectorAll('*');

[...elems].forEach(el => {
  if (el.textContent !== '' && el.matches('H1')) {
    // create div container
    var div = document.createElement('div');

    //Set Id 
    div.id = el.textContent;

    // Get the next sibling next until H1
    var siblings = nextUntil(el, 'H1');
    for (var i = 0; i < siblings.length; i++) {
      // move sibling into div
      div.appendChild(siblings[i]);
    }

    // insert div before el in the DOM tree
    el.parentNode.insertBefore(div, el.nextSibling);
  }
});

function nextUntil(elem, selector) {
  // Setup siblings array
  var siblings = [];
  // Get the next sibling element
  elem = elem.nextElementSibling;
  // As long as a sibling exists
  while (elem) {
    // If we've reached our match
    if (elem.matches(selector))
      break;

    // Otherwise, push it to the siblings array
    siblings.push(elem);

    // Get the next sibling element
    elem = elem.nextElementSibling;
  }
  return siblings;
}

console.log(doc.body.innerHTML);

关于javascript - 使用 DOMParser 在每个 header 后添加 div 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50968100/

相关文章:

javascript - 在 JS(没有 jQuery)中创建 HTML 元素?我究竟做错了什么?

javascript - DOM 解析器 Chrome 扩展内存泄漏

javascript - 从选定的下拉列表中将值附加到文本区域而不删除以前的值

javascript:读取纯 html 字符串并使用 DOMparser 更改链接路径

android - DOM - 从节点解析文本

java - 如何从 java 中的 DOM 解析器读取特定的 XML 标签<示例提到>

javascript - 获得 childnodes child 直到没有

javascript - 导航菜单列表(子菜单)下拉列表在 reactjs 中不起作用

javascript - 在我的案例中使用带有变量的 jquery 选择器失败

javascript - 如何让 svg 图标在 spring-boot :run 后出现