Y a-t-il un moyen de convertir HTML comme:
<div>
<a href="#"></a>
<span></span>
</div>
ou toute autre chaîne HTML dans l'élément DOM? (Pour que je puisse utiliser appendChild ()). Je sais que je peux faire .innerHTML et .innerText, mais ce n'est pas ce que je veux - je veux littéralement être capable de convertir une chaîne HTML dynamique en un élément DOM afin de pouvoir la transmettre à un .appendChild ().
Mise à jour: Il semble y avoir confusion. J'ai le contenu HTML dans une chaîne, en tant que valeur d'une variable en JavaScript. Il n'y a pas de contenu HTML dans le document.
Vous pouvez utiliser un DOMParser
, comme ceci:
var xmlString = "<div id='foo'><a href='#'>Link</a><span></span></div>";
doc = new DOMParser().parseFromString(xmlString, "text/xml");
console.log(doc.firstChild.innerHTML); // => <div id="foo">...
console.log(doc.firstChild.firstChild.innerHTML); // => <a href="#">...
Vous créez généralement un élément parent temporaire dans lequel vous pouvez écrire le innerHTML
, puis extrayez le contenu:
_var wrapper= document.createElement('div');
wrapper.innerHTML= '<div><a href="#"></a><span></span></div>';
var div= wrapper.firstChild;
_
Si l'élément dont vous avez le code HTML externe est un simple _<div>
_ comme ici, c'est simple. Si cela peut être quelque chose d'autre qui ne peut pas aller n'importe où, vous pourriez avoir plus de problèmes. Par exemple, s'il s'agissait d'un _<li>
_, le wrapper parent devrait être un _<ul>
_.
Mais IE ne peut pas écrire innerHTML
sur des éléments tels que _<tr>
_ alors si vous avez un _<td>
_, vous devrez envelopper la chaîne HTML entière dans _<table><tbody><tr>
_..._</tr></tbody></table>
_, écrivez cela dans innerHTML
et extrayez le _<td>
_ que vous vouliez à partir de plusieurs niveaux.
Pourquoi ne pas utiliser insertAdjacentHTML
par exemple:
// <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
Découvrez John Resig analyseur HTML JavaScript pur .
EDIT: si vous voulez que le navigateur analyse le code HTML pour vous, innerHTML
est exactement ce que vous voulez. De this SO question :
var tempDiv = document.createElement('div');
tempDiv.innerHTML = htmlString;
D'accord, j'ai réalisé la réponse moi-même, après avoir dû réfléchir aux réponses des autres. : 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);
Voici un petit code utile.
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
};
}();
- Convertir la chaîne HTML en un élément DOM
String.prototype.toDomElement = function () {
var wrapper = document.createElement('div');
wrapper.innerHTML = this;
var df= document.createDocumentFragment();
return df.addChilds(wrapper.children);
};
- prototype assistant
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;
};
- Usage
thatHTML = uiHelper.getHTML('/Scripts/elevation/ui/add/html/add.txt').toDomElement();
Vous pouvez le faire comme ça:
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);
Donnez simplement un id
à l’élément et traitez-le normalement, par exemple:
<div id="dv">
<a href="#"></a>
<span></span>
</div>
Maintenant tu peux faire comme:
var div = document.getElementById('dv');
div.appendChild(......);
Ou avec jQuery:
$('#dv').get(0).appendChild(........);