La syntaxe est pourtant simple :
Code javascript : | Sélectionner tout |
document.write(arg1, arg2, ..., argn);
Vous noterez au passage que le nombre de paramètres que l'on peut passer à cette méthode est indéterminé.
L'instruction précédente aura pour effet d'ajouter la valeur de chaque paramètre dans la page.
Par exemple
Code javascript : | Sélectionner tout |
document.write('toto', 12, [1,2,3]);
toto121,2,3
Malgré tout, certaines valeurs affichent un résultat inattendu :
Code : | Sélectionner tout |
document.write(false, {toto: 'tata', foo: 'bar'});
false[object Object]
Jusque là, rien de vraiment compliqué à comprendre, d'autant que l'on passe habituellement un seul paramètre correspondant à une chaîne à afficher.
Cependant, le comportement de cette méthode dépend de l'état du document au moment de son appel.
En effet, un document HTML peut avoir deux états distincts : ouvert ou fermé.
Lorsque le navigateur reçoit un contenu HTML à afficher, il commence par ouvrir un document (le flux) puis interprète le code HTML en affichant son contenu et en construisant le DOM et une fois l'intégralité du code interprété, il ferme le document.
Pendant que le document est ouvert, si le navigateur rencontre une instruction JavaScript write(), alors ses arguments sont insérés à l'emplacement de cette instruction dans le code.
C'est le comportement attendu de cette méthode.
Mais il faut savoir que document.write() a besoin que le document soit ouvert pour pouvoir fonctionner correctement. Que se passe-t-il alors si le document est fermé ?
Dans ce cas, JavaScript va appeler en interne l'instruction document.open() puis exécuter le write().
Or document.open() correspond à l'ouverture du flux d'affichage, ce qui signifie que l'appel à cette méthode va recréer un nouveau flux, en commençant par supprimer l'existant.
Pour vous en convaincre, ouvrez une console JavaScript (par exemple Firebug pour Firefox) et dans la ligne de commande, tapez l'instruction
Code javascript : | Sélectionner tout |
document.open();
De la même manière, si vous entrez
Code javascript : | Sélectionner tout |
document.write('Hello world !');
Si ensuite vous entrez l'instruction
Code javascript : | Sélectionner tout |
document.close();
La première impression que l'on pourrait avoir en comprenant ce fonctionnement serait de se dire qu'il faut effectivement faire attention au contexte avant d'utiliser cette méthode.
En fait, il faut surtout considérer write() comme une méthode à bannir.
Déjà, parce qu'une méthode dont on ne peut garantir le comportement n'est pas à recommander.
Ensuite, parce que les bonnes pratiques en développement Web préconisent de séparer les couches : HTML pour l'affichage, CSS pour la mise en forme et JavaScript pour le comportement : utiliser la méthode write() implique d'introduire au niveau de l'affichage du JavaScript qui n'a rien à y faire, surtout que pour manipuler le document, de nombreuses méthodes du DOM sont disponibles et beaucoup plus fiables.
On pourrait aussi évoquer le fait que l'utilisation de write() interdit l'accès aux informations à ceux qui, pour une raison quelconque, ont JavaScript désactivé. Mais surtout, son utilisation (et son existence) force les navigateurs à une pratique particulièrement désagréable et dommageable qui est le chargement des scripts de façon synchrone.
En effet, l'affichage de la page doit être garantit par le navigateur, or si un script possède une instruction write(), alors il est important de pouvoir prévoir de façon certaine à quel endroit du document ses paramètres seront affichés, c'est pour cela que les navigateurs bloquent l'interprétation de la page pendant le chargement et l'évaluation des scripts (à la différence des autres éléments de la page, comme les images ou les iframes) ce qui retarde d'autant l'affichage du reste du contenu.
Billet original publié sur les blogs de developpez.com...