仅使用纯 JavaScript(无 jQuery)将元素添加到给定纯文本 HTML 的 DOM

IT技术 javascript html dom
2021-03-13 04:46:27

我需要能够在给定 HTML 原始文本字符串的情况下向页面添加元素,包括任意数量的标签、属性等。理想情况下,我希望能够对任意格式良好的 html 字符串执行类似操作;

 var theElement = document.createElement("<h1 id='title'>Some Title</h1><span style="display:inline-block; width=100px;">Some arbitrary text</span>");

document.getElementById("body").appendChild(theElement);

显然这行不通,我正在寻找实现相同结果的好方法。如果可能,我想避免解析 HTML。我可以使用的工具受到严格限制,没有 jQuery 或外部包含,并且必须跨浏览器并向后兼容到 IE6。任何帮助都是巨大的。

5个回答

尝试分配给匿名元素innerHTML属性并附加它的每个children.

function appendHtml(el, str) {
  var div = document.createElement('div');
  div.innerHTML = str;
  while (div.children.length > 0) {
    el.appendChild(div.children[0]);
  }
}
var html = '<h1 id="title">Some Title</h1><span style="display:inline-block; width=100px;">Some arbitrary text</span>';
appendHtml(document.body, html); // "body" has two more children - h1 and span.
@kirps:是的,我终于测试了该示例代码并发现了“appendChild”的奇怪行为及其对包含父元素的“children”属性的影响。
2021-04-17 04:46:27
切换到 while 循环的编辑使用索引修复了 for 循环的问题,因为 appendChild 实际上从 div 中删除元素以将其附加到正文。克隆子节点也是一种不太优雅的方法。
2021-04-27 04:46:27
您应该使用DocumentFragment而不是 div;移动子节点会更快更容易。编辑:刮掉该评论,因为您无法设置innerHTMLDocumentFragment。
2021-04-30 04:46:27

您可以使用insertAdjacentHTML

document.body.insertAdjacentHTML("beforeend", theHTMLToInsert);

除了 之外还有其他选项beforeend,但听起来您想附加到元素,这就是beforeend

现场示例:

与使用+=with不同innerHTML,这不需要浏览器遍历元素的内容并创建一个 HTML 字符串来表示它,销毁这些元素(包括它们上的任何事件处理程序),并用相同的元素替换它们加上你的补充。它只是添加您的添加内容,而现有内容保持不变。

这个答案是完美的。通过使用innerHTML,某些网页确实可以工作,例如 Google Calendar、Backlog、Amazon 等(我在控制台中运行)。通过使用insertAdjacentHTML,对原始网页没有影响。太感谢了!
2021-04-28 04:46:27
那太完美了......荣誉
2021-05-06 04:46:27
var el =  document.createElement("h1")
el.id="title";
el.innerHTML = "Some title";
document.body.appendChild(el);

var el2 =  document.createElement("span")
el2.style.display="block";
el2.style.width="100%";
el2.innerHTML = "Some arb text";
document.body.appendChild(el2);

应该工作(小提琴:http : //jsfiddle.net/gWHVy/

编辑: 这是一种特殊情况的解决方案,您知道要插入的内容的直接子项的属性。看一下Aaron解决方案,它适用于一般情况。

看看@Aaron 的解决方案。他的方法会奏效。但是,对于您希望在跨度中使用它的特殊情况,此解决方案更简单。
2021-05-03 04:46:27
这有效,但不能回答插入任意原始文本 HTML 的问题。
2021-05-10 04:46:27

您可以获取要在其下插入 HTML 的元素的 elementId,并使用 innerHTML 来添加 html。

document.getElementById("body").innerHTML = "<h1 id='title'>Some Title</h1><span>test</span>";
不确定document.getElementById("body")在我看来哪个是相当...... NULL !;-) 利用document.getElementsByTagName('body')[0]
2021-05-17 04:46:27

maerics 解决方案立即解决了我的问题。但是,我需要对其进行快速调整以完成我需要的操作。我有几个脚本和样式表可以在点击时加载。我无法将脚本或样式表作为实际对象添加到 DOM 后加载。如果您将innerHTML 设置为document.body 以包含该<link rel="stylesheet" />部分,则它只会打印文本,浏览器不会将其识别为链接对象。为了解决这个问题,我使用了以下代码。

function appendHtml(el, str) {
  var div = document.createElement('div');
  div.innerHTML = str;
  while (div.children.length > 0) {
      if ( div.children[0].tagName == 'LINK' ) {
          // Create an actual link element to append later
          style = document.createElement('link');
          style.href = div.children[0].href;
          // append your other things like rel, type, etc
          el.appendChild(style);
      }
      el.appendChild(div.children[0]);
  }
}