Pourquoi dois-je utiliser document.write au lieu des méthodes de manipulation DOM?

J'essaie un nouveau service publicitaire, et pour autant que je sache, ils ne fournissent pas une interface fonctionnelle pour charger leurs annonces. Nous voulons afficher différentes tailles d'annonces en fonction de la taille de l'écran de l'utilisateur, et ce service vous oblige à charger une URL .js différente pour chaque taille.

J'ai d'abord essayé d'écrire:

 <script type="text/javascript"><!-- var dochead = document.getElementsByTagName('head')[0]; var newscript = document.createElement('script'); newscript.type = "text/javascript"; newscript.src = '//ads-by.madadsmedia.com/tags/22430/9194/async/' + (screen.width >= 1360 ? '160' : '120') + 'x600.js'; dochead.appendChild(newscript); //--> </script> 

Mais je viens d'avoir une page vierge. J'ai regardé dans les outils de développement de Chrome et il semblait être en train de charger correctement leur script. Leur script contient d'autres scripts de Google, et ils apparaissaient également dans les DOM. Mais il n'y avait pas d'image publicitaire.

Lorsque j'ai changé mon script pour:

 <script language="JavaScript" type="text/javascript"> var prot = document.location.protocol; var adwidth = (screen.width >= 1360 ? '160' : '120'); document.write('<script language="JavaScript" type="text/javascript"'); document.write('src="'+prot+'//ads-by.madadsmedia.com/tags/22430/9194/async/'+adwidth+'x600.js">'); document.write('<\/scr' + 'ipt>'); </script> 

Cela a fonctionné correctement. Je n'aime généralement pas utiliser document.write , je me demande pourquoi il est nécessaire dans ce cas? Le script du service publicitaire utilise largement document.write , c'est pourquoi?

Parce qu'ils utilisent document.write() :

http://ads-by.madadsmedia.com/tags/22430/9194/async/160×600.js :

 if (!window.ActiveXObject){ document.write("<div style=\"text-align: center; margin: 0px auto; width:160px; height:600px; position:relative;\">"); // etc. 

Si document.write() n'est pas exécuté en ligne et activement "ouvrir" document, il va clobber ce qui est là. Ainsi, l'exécution de leur script post-load remplace votre contenu par leur script.

Si leur script utilise document.write il est possible que la page soit vide, car elle écrase le flux.

Document.write efface la page

Vous pouvez remplacer document.write tant que solution corrective: (mais je ne le ferais pas …..)

Comment traiter avec document.write dans un script ajouté après la chargement d'une page?

Si le document est chargé, son état prêt est interactif mais l'élément du corps n'a pas été entièrement analysé. Vous ne pouvez pas ajouter un enfant à un élément qui n'a pas été chargé. Il en résulte une erreur et le script s'arrête.

Dochead.appendChild (newscript);

La solution rapide consiste à exécuter votre fonction à l'aide d'un événement body.onload. Déplacer le script vers le bas de la page peut fonctionner mais je ne considérerais pas cela comme fiable dans un monde qui inclut Internet Explorer et les navigateurs mal comportés.