Introduction
Pour des blocs HTML relativement statiques (entêtes, pieds de page…), on cherche souvent une méthode simple pour importer du code HTML à partir de fichiers.
Il existait une méthode simple, comme importer des fichiers CSS, JS :
<link rel="import" href="footer.html">
MAIS, cette spécification a été rendue obsolète. Elle ne fonctionne plus à partir de Chrome 73. Elle peut encore fonctionner sur certains navigateurs, toutefois son utilisation est vivement déconseillée, cette syntaxe pouvant être retirée à tout moment.
Quelle est l’alternative ? Utiliser la méthode javascript fetch
.
Dans l’exemple, on veut inclure les données HTML du pied de page à partir d’un fichier appelé footer.inc
:
footer.inc
<div>
<div>
<div>© <span id="footer-org"></span> 2001-2021. All rights reserved.</div>
<nav class="inline-right pipe">
<ul>
<li><a href="/en/documents/about-sqlpac.html">About</a></li>
<li><a href="/en/documents/cookie-privacy-policy.html">Privacy policy</a></li>
</ul>
</nav>
</div>
</div>
La méthode fetch
Créer une fonction qui chargera les données après l’événement DOMContentLoaded
:
loadfooter = () => {
fetch('./include/footer.inc')
.then ( (r) => { return r.text(); } )
.then ( (s) => {
p= new DOMParser();
d = p.parseFromString(s,'text/html') ;
});
};
if (document.readyState==='loading') {
window.addEventListener('DOMContentLoaded', ()=> { loadfooter(); });
} else { loadfooter(); }
- La méthode
text()
retourne le contenu du fichier dans une variable string. - Un nouvel objet DOM est construit à partir du string retourné avec la méthode
parseFromString()
.
La structure de l’objet DOM est alors la suivante :
#document
<html>
<head></head>
<body>
<div>
<div>© <span id="footer-org"></span> 2001-2021. All rights reserved.</div>
…
</div>
</body>
</html>
Le bloc div
à insérer est alors extrait de l’objet DOM et ajouté dans le bloc footer
existant dans le document :
loadfooter = () => {
fetch('./include/fr/footer.inc')
.then ( (r) => { return r.text(); } )
.then ( (s) => {
p= new DOMParser();
d = p.parseFromString(s,'text/html') ;
if ((f = d.body.querySelector('div')) !== null) {
document.querySelector('footer').append(f);
}
});
};
clone
si on ne souhaite pas que l’élément soit supprimé de l’objet DOM pour un traitement ultérieur.Modèles - Templates
Les méthodes fetch
et parseFromString
sont très utiles pour importer des fichiers modèles (templates).
L’élément peut en effet être enrichi et formaté avant d’insérer celui-ci dans le document final.
loadfooter = () => {
fetch('./include/fr/footer.inc')
.then ( (r) => { return r.text(); } )
.then ( (s) => {
p= new DOMParser();
d = p.parseFromString(s,'text/html') ;
if ((f = d.body.querySelector('div')) !== null) {
f.querySelector(`span[id="footer-org"]`)
.append(document.createTextNode('SQLPAC'));
document.querySelector('footer').append(f);
}
});
};