|
- Quando utilizzare innerHTML e outerHTML - |
|||
| COSA SERVE PER QUESTO TUTORIAL | |||
| Download | Chiedi sul FORUM | Glossario | cognizioni di base di HTML e Javascript | ||
| La disputa su innerHTML e compatibilità con gli standard | |||
INNERHTML: QUANDO SERVIRSENE Quando è indispensabile utilizzare innerHTML
Nel mondo dello sviluppo sul web l'uso della proprietà innerHTML è molto
contestata in quanto non compatibile con gli standard (ovvero non definita negli standard
W3C per il DOM, Document Object Model) e per il suo approccio all'HTML
come stringa, contraria alla visione su cui è impostato l'intero DOM che
lo intende invece come un albero di nodi (elementi, attributi, commenti,
spazi, nodi di testo e così via). Tuttavia vi sono occasioni in cui
utilizzare innerHTML è la scelta, oltre che più ovvia, più saggia,
soprattutto considerando che, pur non essendo parte degli standard, essa
è supportata dalla quasi totalità dei browser moderni (fin da Internet
Explorer 4, Netscape 4, tutti i Firefox, Opera 7 e Konqueror 2).
Inoltre la proprietà innerHTML è stata definita negli standard di
HTML5, che tuttavia ancora non è diffuso. Effettivamente innerHTML andrebbe evitato quanto più possibile, poiché,
anche se aumenta la velocità di stesura del codice, è in realtà un
metodo sporco ed inelegante. Supponiamo tuttavia di avere una tipica
situazione di una pagina in cui viene usato AJAX: in genere ad ogni richiesta
corrisponde un responso che non può però essere sempre strutturato in
maniera rigida.
<responso>
<cliente>
<nome>Mario</nome>
<cognome>Rossi</cognome>
<biografia>Nasce a Roma, muore a Milano.</biografia>
</cliente>
</responso>
Questo responso andrà poi interpretato tramite Javascript e quindi mostrato all'utente nella maniera più consona. Ma se il campo biografia dovesse contenere della formattazione? O peggio, se la richiesta fatta è una porzione di un vero e proprio documento HTML? Vediamo dunque un esempio più articolato:
<responso>
<cliente>
<nome>Mario</nome>
<cognome>Rossi</cognome>
<biografia>
Nasce a <strong>Roma</strong>,
muore a <strong>Milano</strong>.
</biografia>
<articolo>
<div>
Una <a href="definzione_penna.html">penna</a>
luminosa.
</div>
<div>
<input type="button" onclick="alert('Ottima scelta')" value="Acquista">
</div>
</articolo>
</cliente>
</responso>
In questo caso l'unica alternativa all'utilizzo di innerHTML sarebbe
scrivere un parser in Javascript per poi effettuare chiamate a metodi
standard del DOM, il che è del tutto inutile, in quanto questa
funzionalità è già implementata in tutti i browser (in maniera
certamente molto migliore e più prestante di quanto potrebbe fare il
programmatore in Javascript) e si chiama innerHTML appunto. Una versione cross-browser della funzione outerHTML Internet Explorer (insieme a Safari, Opera e altri) mette a disposizione un'altra proprietà per tutti gli elementi oltre a innerHTML: outerHTML. Come il nome lascia intuire, se innerHTML restituisce/imposta il contenuto di un certo elemento, outerHTML restituisce/imposta il contenuto e l'elemento stesso:
<html>
<body>
<div style="color:red" id="div1">Contenuto vecchio 1</div>
<div style="color:red" id="div2">Contenuto vecchio 2</div>
<script type="text/javascript" language="javascript">
document.getElementById("div1").innerHTML = "Contenuto nuovo 1";
/* Non funziona su Firefox */
document.getElementById("div2").outerHTML =
"<div style=\"color:green\">Contenuto nuovo 2</div>";
</script>
</body>
</html>
Tuttavia outerHTML non è supportato ampiamente come innerHTML (in particolare Firefox e tutti i browser derivanti da Gecko non la supportano), ma è facilmente implementabile come funzione su tutti i browser servendosi esclusivamente della proprietà innerHTML e di funzioni del DOM standard (quindi senza amplificare il "danno" rispetto all'uso di innerHTML):
function outerHTML(elm, html) {
var elmNew = document.createElement("div");
elmNew.innerHTML = html;
for(var elmContent = elmNew.firstChild;
elmNew.firstChild.nextSibling;
elmContent = elmNew.firstChild) {
elm.parentNode.insertBefore(elmContent, elm);
}
elm.parentNode.replaceChild(elmContent, elm);
}
La funzione non fa null'altro che creare un elemento DIV senza aggiungerlo a nessuna parte dell'albero HTML, ma impostando il suo contenuto tramite la proprietà innerHTML sul parametro html, quindi inserisce i figli prima dell'elemento da rimpiazzare e infine sostituisce l'elemento originale con l'ultimo figlio.
|
|||
| << INDIETRO | by VeNoM00 | ||