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

Tow*_*wer 179 html javascript dom

有没有办法转换HTML像:

<div>
<a href="#"></a>
<span></span>
</div>
Run Code Online (Sandbox Code Playgroud)

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

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

mae*_*ics 300

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果将创建的节点放回浏览器的DOM(Safari 9.1.2),我发现使用"text/html"而不是"text/xml"至关重要.否则,CSS呈现无法正常工作.如果你使用它,使用'.body'绕过自动插入的body元素. (14认同)
  • @maerics为什么你不能只用'text/html`来解析HTML? (8认同)
  • 如果你因为试图加载**HTML**而不是**XML**而不是像标签那样出现错误,那么请看这里:https://developer.mozilla.org/en-US/docs/DOM/DOMParser在"DOMParser HTML extension for other browsers"下支持加载HTML (7认同)
  • @Djack你可以,但随后你会自动生成'html'和'body'标签. (5认同)
  • 谢谢,效果很好。在阅读 Mozilla 文章后,我意识到浏览器也可以解析 XML AJAX 响应——所以像 IE 这样不支持 DOMParser 的浏览器,我使用带有数据 URI 的同步 AJAX 调用来解析 XML。:) (3认同)
  • @maerics如果您想为元素添加特殊含义,则此解决方案将不起作用。例如,“&lt;a href="www.google.com"&gt;test&lt;/a&gt;”应该重定向到 *www.google.com*,但事实并非如此。要保留元素上下文,您必须将类型更改为“text/html”。我有这个[问题](/sf/ask/4427885101/),我真的很困惑为什么这个解决方案是不工作。 (2认同)
  • 我得到`td.appendChild(domparsed)`:`未捕获(承诺中)DOMException:无法在'Node'上执行'appendChild':'#document'类型的节点可能无法插入'TD'类型的节点内。 ` (2认同)

bob*_*nce 191

您通常创建一个可以编写的临时父元素innerHTML,然后提取内容:

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

如果你所拥有的外部HTML的元素很简单<div>,这很容易.如果它可能是其他任何东西都不能去的东西,那么你可能会遇到更多问题.例如,如果是a <li>,则必须将父包装器设为a <ul>.

但IE不能写innerHTML上相似的元素<tr>,如果你有一个这样<td>你不得不包住整个HTML串<table><tbody><tr>...... </tr></tbody></table>,写的是innerHTML和解脱实际<td>你从几个层面的希望了.

  • +1这个解决方案可能更便携. (12认同)
  • @bryc字符串如何附加事件处理程序/ (10认同)
  • 请记住,此方法将丢失任何事先分配给它的事件处理程序或其他属性。 (2认同)

Ram*_*Ram 45

为什么不使用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
Run Code Online (Sandbox Code Playgroud)

  • 为什么不用一个例子给出一个正常的答案? (2认同)
  • 您知道您将在DOM中使用此元素才能使其正常工作吗?并且你不想在DOM中真正想要这个元素,你只想在内存中将字符串转换为HTML**** (2认同)

ori*_*rip 14

查看John Resig的纯JavaScript HTML解析器.

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

var tempDiv = document.createElement('div');
tempDiv.innerHTML = htmlString;
Run Code Online (Sandbox Code Playgroud)


Tow*_*wer 5

好吧,在我不得不考虑其他人的答案之后,我自己意识到了答案。: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);
Run Code Online (Sandbox Code Playgroud)

  • 您不需要在文档中添加“e”。你也不需要对它做 setAttribute 。 (9认同)