379 votes

Pourquoi document.write est-il considéré comme une "mauvaise pratique" ?

Je sais que document.write est considéré comme une mauvaise pratique ; et j'espère compiler une liste de raisons à soumettre à un vendeur tiers pour expliquer pourquoi il ne devrait pas utiliser le système document.write dans la mise en œuvre de leur code d'analyse.

Veuillez indiquer la raison de votre demande document.write comme une mauvaise pratique ci-dessous.

254voto

annakata Points 42676

Quelques-uns des problèmes les plus graves :

  • document.write (ci-après DW) ne fonctionne pas en XHTML

  • DW ne modifie pas directement le DOM, ce qui empêche toute manipulation ultérieure. (j'essaie de trouver des preuves de cette affirmation, mais elles sont au mieux situationnelles)

  • DW exécuté après la fin du chargement de la page écrasera la page, écrira une nouvelle page ou ne fonctionnera pas.

  • La DW s'exécute là où elle est rencontrée : elle ne peut pas injecter à un point nodal donné.

  • DW écrit effectivement du texte sérialisé, ce qui n'est pas la façon dont le DOM fonctionne conceptuellement, et c'est un moyen facile de créer des bogues (.innerHTML a le même problème).

Il est de loin préférable d'utiliser le système sûr et respectueux des DOM Méthodes de manipulation du DOM

42 votes

-1, il modifie absolument le DOM. Tout le reste va bien. Bien que je comprenne l'envie de dépendre d'une structure et de méthodes qui peuvent vous mettre à l'abri du danger, il s'agit peut-être ici de jeter le bébé avec l'eau du bain.

0 votes

(pour voir qu'il modifie le DOM, faites un document.write dans firebug après que cette page ait été chargée et inspectez ensuite le DOM, et le résultat (une page maintenant effacée avec le contenu de votre document.write) sera clairement visible.

0 votes

Bon sang, je savoir Cela a déjà été un problème, mais j'ai du mal à trouver un navigateur ou une situation où cela se produit. Je le supprimerai tant que je n'aurai pas trouvé de preuve. Maudite soit ma faible mémoire.

131voto

Peter Bailey Points 62125

En fait, il n'y a rien de mal à document.write en tant que tel. Le problème est qu'il est très facile de l'utiliser à mauvais escient. Grossièrement, même.

En ce qui concerne les fournisseurs de code d'analyse (comme Google Analytics), c'est en fait la manière la plus facile pour eux de distribuer de tels extraits.

  1. Les scripts sont ainsi réduits.
  2. Ils n'ont pas à se préoccuper de surcharger des événements onload déjà établis ou d'inclure l'abstraction nécessaire pour ajouter des événements onload en toute sécurité.
  3. Il est extrêmement compatible

Tant que vous n'essayez pas de l'utiliser après le chargement du document , document.write n'est pas intrinsèquement mauvais, à mon humble avis.

5 votes

Document.write fait des choses vraiment horribles aux analyseurs html, et n'est "extrêmement compatible" que dans des cas simples.

27 votes

Comme l'insertion d'une balise analytique ? Cela fait d'ailleurs partie de la question initiale. Et par extrêmement compatible, j'entends simplement la prise en charge brute par le navigateur de la méthode document.write.

0 votes

Tout ce qui fonctionne avec les dernières versions de Chrome / IE / Safari / Opera / FireFox est considéré comme compatible.

45voto

Sean McMillan Points 5096

Il peut bloquer votre page

document.write ne fonctionne que pendant le chargement de la page ; si vous l'appelez après le chargement de la page, elle écrasera toute la page.

Cela signifie que vous devez l'appeler à partir d'un bloc script en ligne - ce qui empêchera le navigateur de traiter les parties de la page qui suivent. Les script et les images ne seront pas téléchargés tant que le bloc d'écriture ne sera pas terminé.

44voto

Kevin Hakanson Points 15498

Une autre utilisation légitime de l document.write provient du HTML5 Boilerplate index.html exemple.

<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.3.min.js"><\/script>')</script>

J'ai également vu la même technique pour l'utilisation de la fonction json2.js Polyfill JSON parse/stringify ( nécessaire pour IE7 et les versions inférieures ).

<script>window.JSON || document.write('<script src="json2.js"><\/script>')</script>

12 votes

Ce n'est pas une mauvaise utilisation, mais il est toujours "préférable" d'utiliser les fonctions de manipulation du DOM - même Google le fait pour Google Analytics. L'extrait est ici .

9 votes

@BMiner si vous insérez un script via la manipulation du DOM, est-il chargé de manière synchrone ? Si ce n'est pas le cas, il ne s'agit pas d'un remplacement.

2 votes

@JanDvorak - Bon point ; lorsque vous utilisez des manipulations DOM, les navigateurs chargent généralement le script de manière asynchrone. Vous pouvez utiliser l'élément onload Événement DOM pour déterminer quand le script chargé de manière asynchrone est disponible pour utilisation.

33voto

Tracker1 Points 6573

Pro :

  • C'est le moyen le plus simple d'intégrer du contenu en ligne provenant d'un script externe (à votre hôte/domaine).
  • Vous pouvez écraser tout le contenu d'un cadre/iframe. J'utilisais beaucoup cette technique pour les éléments de menu/navigation avant que les techniques Ajax plus modernes ne soient largement disponibles (1998-2002).

Con :

  • Il sérialise le moteur de rendu pour le mettre en pause jusqu'à ce que le script externe soit chargé, ce qui peut prendre beaucoup plus de temps qu'un script interne.
  • Il est généralement utilisé de telle sorte que le script est placé dans le contenu, ce qui est considéré comme une mauvaise forme.

5 votes

Il y a plus d'inconvénients que cela. Par exemple, Google Chrome refusera de fonctionner document.write qui crée <script> dans certaines circonstances. developers.google.com/web/updates/2016/08/

0 votes

@Flimm il faut noter que votre commentaire est plus de 8 ans après ma réponse et celui-ci presque 3 ans plus tard. Oui, il y a d'autres inconvénients... et je serais surpris que document.write lui-même ne disparaisse pas... ainsi que d'autres interfaces très utilisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X