
JS vlastnost innerHTML
Jak funguje vlastnost innerHTML v JavaScriptu. Různé způsoby vypisování obsahu v JS.
Napříč prohlížeči široce podporovaná metoda innerHTML slouží v JS k:
- získání HTML obsahu nějakého elementu,
- nastavení HTML obsahu do nějakého elementu.
Získání obsahu
Po získání elementu (metodami getElement*, querySelectorem a podobně) jde pracovat s jeho vlastností innerHTML. Třeba HTML obsah elementu s identifikátorem „element“ vypsat hláškou alert.
<div id="element">Obsah</div>
<script>
var el = document.getElementById("element");
alert(el.innerHTML); // vypíše „Obsah“
</script>
Nastavení innerHTML
Zajímavější je nepochybně nějaké HTML za pomoci JavaScriptu nastavovat. Díky tomu je možné do stránky dynamicky vypisovat obsah.
<div id="prazdny-element"></div>
<script>
var el = document.getElementById("prazdny-element");
el.innerHTML = "Obsah";
</script>
Tento kód vloží do prázdného <div>u Obsah. Ukázka
Upozornění: Důležitý obsah by měl být přímo v HTML. S obsahem vypsaným JavaScriptem mohou mít problémy vyhledávače.
Jak innerHTML funguje?
Při nastavení innerHTML musí prohlížeč projít obsah řetězce a podle toho poupravit celý DOM (Document Object Model) daného elementu.
Z toho plyne pár úskalí, na která je si dobré dát pozor.
Úprava innerHTML v cyklu
Mějme následující kód, který si najde seznam a v cyklu do něj vloží 10 položek.
var element = document.getElementById("seznam");
for (var i = 1; i <= 10; i++) {
element.innerHTML += "<li>" + i + "</li>";
}
Funkční to bude, ale zbytečně neefektivní – každý jednotlivý průchod cyklu bude manipulovat s DOMem celého elementu.
Lepší řešení proto je si obsah ukládat do pomocné proměnné a pomocí innerHTML ho nastavit najednou:
var element = document.getElementById("seznam");
var obsah = "";
for (var i = 1; i <= 10; i++) {
obsah += "<li>" + i + "</li>";
}
element.innerHTML = obsah;
Připojení obsahu
Konstrukce element.innerHTML += "<p>něco</p>" je obecně ve většině případů dost nešťastná.
Kvůli přidání něčeho se musí znovu vytvořit celý DOM elementu. Kromě toho, že to u složitějších věcí dlouho trvá, se tím zresetuje dosavadní stav – například vyplněná políčka formulářů a podobně. (Někdy se to ale může hodit – třeba u resetování <input type="file">.)
Vlastnost insertAdjacentHTML
Řešením na překreslování DOMu při změně innerHTML je metoda insertAdjacentHTML.
Funguje ve všech aktuálních versích prohlížečů (IE 4+, Chrome 1+, Firefox 8+, Opera 7+).
element.insertAdjacentHTML(umisteni, obsah);
První parametr umisteni určuje, kam se obsah má vložit:
beforebegin– před elementafterbegin– na začátek elementubeforeend– před konec elementuafterend– za element
U prostého odstavce vypadají posice následovně.
<!-- beforebegin -->
<p>
<!-- afterbegin -->
Obsah
<!-- beforeend -->
</p>
<!-- afterend -->
Druhý parametr obsah je potom text / HTML kód, který se má vložit.
Vlastnosti textContent a innerText
Pro získávání/nastavování obsahu, který neobsahuje HTML, existují vlastnosti podobné jako innerHTML.
Vlastnosti textContent i innerText fungují obdobně, jen mají různou podporu v prohlížečích.
textContent– funguje od IE 9innerText– funguje všude kromě Firefoxu
Kvůli těmto rozdílům je snazší používat innerHTML. V případě, že je vyloženě cílem získat obsah bez HTML značek, je možné obě vlastnosti sjednotit.
var text = element.textContent || element.innerText;
Odkazy jinam
- DevDocs: Node.textContent
- MDN: Element.insertAdjacentHTML()
- John Resig: DOM insertAdjacentHTML
Související články
JavaScript null a undefined
Rozdíly mezi null a undefined v JavaScriptu, kdy je používat a jak se vyhnout běžným chybám.
Sleep v JavaScriptu
Jak implementovat sleep/delay funkcionalitu v JavaScriptu pomocí Promise a async/await
JavaScript Battery API
Jak v JS zjistit stav baterie, co dnes funguje a kdy API nepoužívat.