Is er een manier om HTML te converteren zoals:
<div>
<a href="#"></a>
<span></span>
</div>
of een andere HTML-string in het DOM-element? (Zodat ik appendChild() kon gebruiken). Ik weet dat ik .innerHTML en .innerText kan doen, maar dat is niet wat ik wil — ik wil letterlijk in staat zijn om een dynamische HTML-string om te zetten in een DOM-element, zodat ik het in een .appendChild() kan doorgeven.
Update: er lijkt verwarring te zijn. Ik heb de HTML-inhoud in een string, als een waarde van een variabele in JavaScript. Het document bevat geen HTML-inhoud.
Antwoord 1, autoriteit 100%
Je kunt een DOMParser
gebruiken, zoals:
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
Antwoord 2, autoriteit 52%
U maakt meestal een tijdelijk bovenliggend element waarnaar u de innerHTML
kunt schrijven en vervolgens de inhoud extraheren:
var wrapper= document.createElement('div');
wrapper.innerHTML= '<div><a href="#"></a><span></span></div>';
var div= wrapper.firstChild;
Als het element waarvan u de buitenste HTML-code heeft een eenvoudige <div>
is zoals hier, is dit eenvoudig. Als het misschien iets anders is dat niet zomaar overal kan, heb je misschien meer problemen. Als het bijvoorbeeld een <li>
was, zou de bovenliggende wrapper een <ul>
moeten zijn.
Maar IE kan innerHTML
niet schrijven op elementen zoals <tr>
dus als je een <td>
had, zou je moet de hele HTML-tekenreeks in <table><tbody><tr>
…</tr></tbody></table>
, schrijf datnaar innerHTML
en haal de daadwerkelijke <td>
die je wilde van een paar niveaus naar beneden.
Antwoord 3, autoriteit 17%
Waarom gebruikt u insertAdjacentHTML
niet
bijvoorbeeld:
// <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
Antwoord 4, autoriteit 4%
Bekijk de pure JavaScript HTML-parservan John Resig.
EDIT: als je wilt dat de browser de HTML voor je parseert, is innerHTML
precies wat je wilt. Van deze SO-vraag:
var tempDiv = document.createElement('div');
tempDiv.innerHTML = htmlString;
Antwoord 5
Ok, ik realiseerde me het antwoord zelf, nadat ik moest nadenken over de antwoorden van anderen. 😛
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);
Antwoord 6
Hier is een kleine code die handig is.
var uiHelper = function () {
var htmls = {};
var getHTML = function (url) {
/// <summary>Returns HTML in a string format</summary>
/// <param name="url" type="string">The url to the file with the HTML</param>
if (!htmls[url])
{
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url, false);
xmlhttp.send();
htmls[url] = xmlhttp.responseText;
};
return htmls[url];
};
return {
getHTML: getHTML
};
}();
–Converteer de HTML-tekenreeks in een DOM-element
String.prototype.toDomElement = function () {
var wrapper = document.createElement('div');
wrapper.innerHTML = this;
var df= document.createDocumentFragment();
return df.addChilds(wrapper.children);
};
–prototype helper
HTMLElement.prototype.addChilds = function (newChilds) {
/// <summary>Add an array of child elements</summary>
/// <param name="newChilds" type="Array">Array of HTMLElements to add to this HTMLElement</param>
/// <returns type="this" />
for (var i = 0; i < newChilds.length; i += 1) { this.appendChild(newChilds[i]); };
return this;
};
–Gebruik
thatHTML = uiHelper.getHTML('/Scripts/elevation/ui/add/html/add.txt').toDomElement();
Antwoord 7
Geef gewoon een id
aan het element en verwerk het normaal, bijvoorbeeld:
<div id="dv">
<a href="#"></a>
<span></span>
</div>
Je kunt nu het volgende doen:
var div = document.getElementById('dv');
div.appendChild(......);
Of met jQuery:
$('#dv').get(0).appendChild(........);
Antwoord 8
Je kunt het als volgt doen:
String.prototype.toDOM=function(){
var d=document
,i
,a=d.createElement("div")
,b=d.createDocumentFragment();
a.innerHTML=this;
while(i=a.firstChild)b.appendChild(i);
return b;
};
var foo="<img src='//placekitten.com/100/100'>foo<i>bar</i>".toDOM();
document.body.appendChild(foo);