将 HTML 字符串转换为 DOM 元素?

IT技术 javascript html dom
2021-01-27 00:43:17

有没有办法像转换 HTML 一样:

<div>
<a href="#"></a>
<span></span>
</div>

或任何其他 HTML 字符串到 DOM 元素?(这样我就可以使用 appendChild())。我知道我可以做 .innerHTML 和 .innerText,但这不是我想要的——我真的希望能够将动态 HTML 字符串转换为 DOM 元素,以便我可以在 .appendChild() 中传递它。

更新:似乎有混淆。我有一个字符串中的 HTML 内容,作为 JavaScript 中变量的值。文档中没有 HTML 内容。

6个回答

您可以使用 a DOMParser,如下所示:

var xmlString = "<div id='foo'><a href='#'>Link</a><span></span></div>";
var doc = new DOMParser().parseFromString(xmlString, "text/xml");
console.log(doc.firstChild.innerHTML); // => <a href="#">Link...
console.log(doc.firstChild.firstChild.innerHTML); // => Link

谢谢,效果很好。在阅读 Mozilla 文章后,我意识到浏览器也可以解析 XML AJAX 响应——所以像 IE 这样不支持 DOMParser 的浏览器,我使用带有数据 URI 的同步 AJAX 调用来解析 XML。:)
2021-03-11 00:43:17
注意:如果将创建的节点放回浏览器的 DOM (Safari 9.1.2),我发现使用“text/html”而不是“text/xml”至关重要。否则,CSS 渲染无法正常工作。如果您使用它,请使用 '.body' 绕过自动插入的 body 元素。
2021-03-11 00:43:17
如果您因为尝试加载HTML而不是像 <br> 标签这样的XML出现错误,请查看此处:developer.mozilla.org/en-US/docs/DOM/DOMParser在“DOMParser HTML extension for other browsers”下支持加载 HTML
2021-03-20 00:43:17
@Djack你可以,但是你会自动生成“html”和“body”标签。
2021-04-04 00:43:17
@maerics 为什么你不能只说text/htmlHTML 解析?
2021-04-07 00:43:17

您通常会创建一个临时父元素,您可以在其中写入innerHTML,然后提取内容:

var wrapper= document.createElement('div');
wrapper.innerHTML= '<div><a href="#"></a><span></span></div>';
var div= wrapper.firstChild;

如果您获得的外部 HTML 元素<div>像这里一样简单,这很容易。如果它可能是其他任何地方都不能去的东西,那么您可能会遇到更多问题。例如,如果它是 a <li>,则您必须将父包装器设为 a <ul>

但IE不能写innerHTML上相似的元素<tr>,如果你有一个这样<td>你必须包装在整个HTML串<table><tbody><tr>...... </tr></tbody></table>,写的是innerHTML和解脱实际<td>你从几个级别的下降通缉。

请记住,此方法将丢失任何预先分配给它的事件处理程序或其他属性。
2021-03-12 00:43:17
@bryc 字符串如何附加事件处理程序/
2021-03-21 00:43:17
+1 此解决方案可能更便携。
2021-04-03 00:43:17
@Muhammad - 也许通过使用类似的东西,onclick="..."尽管这当然不适用于 HTML 中未定义的事件处理程序,这可能就是您的意思。
2021-04-09 00:43:17
如果字符串是这样的some string at the start <div><a href="#">anchor text</a><span>inner text</span></div>string end怎么办?
2021-04-09 00:43:17

为什么不使用insertAdjacentHTML

例如:

// <div id="one">one</div> 
var d1 = document.getElementById('one'); 
d1.insertAdjacentHTML('afterend', '<div id="two">two</div>');

// At this point, the new structure is:
// <div id="one">one</div><div id="two">two</div>here
你知道你会在 DOM 中拥有这个元素才能正常工作吗?并且您无论如何都不想在 DOM 中使用此元素,您只想将字符串转换为内存中的HTML
2021-03-15 00:43:17
为什么不用一个例子给出一个正常的答案?
2021-03-20 00:43:17
在链接中有一个例子 - 但我也复制粘贴在这里
2021-03-20 00:43:17

查看 John Resig 的纯 JavaScript HTML 解析器

编辑:如果您希望浏览器为您解析 HTML,innerHTML这正是您想要的。这个问题

var tempDiv = document.createElement('div');
tempDiv.innerHTML = htmlString;
在编写示例时,我注意到简单的 HTML 标签可以正确呈现(在 IE7 上),但是当我尝试使用脚本执行此操作时,我正在处理的情况就是这种情况,脚本不起作用。示例:小提琴您可能必须在本地 html 页面上运行代码(jsfiddle 在 IE7 中不能很好地工作)。
2021-03-13 00:43:17
这段代码有一个小问题:如果htmlString喜欢它就不能正常工作<tr>...</tr>:(
2021-03-20 00:43:17

好吧,在我不得不考虑其他人的答案之后,我自己意识到了答案。:P

var htmlContent = ... // a response via AJAX containing HTML
var e = document.createElement('div');
e.setAttribute('style', 'display: none;');
e.innerHTML = htmlContent;
document.body.appendChild(e);
var htmlConvertedIntoDom = e.lastChild.childNodes; // the HTML converted into a DOM element :), now let's remove the
document.body.removeChild(e);
您不需要在文档中添加“e”。你也不需要对它做 setAttribute 。
2021-03-25 00:43:17