javascript
  • document.write
  • 2009-02-17 9 views 18 likes 
    18

    Je me demandais pourquoi ad Utilisons encore l'approche document.write pour insérer l'ajouter dans la pagePourquoi utiliser document.write?

    <script language="javascript" type="text/javascript"> 
        document.write("<script type='text/javascript' src='http://addomain/someadd.js'><\/sc" + "ript>"); 
    </script> 
    

    Pourquoi est-ce que je ne peux pas mettre

    <script type='text/javascript' src='http://addomain/someadd.js'></script> 
    

    Au lieu de l'annonce ?

    +1

    Cercle dupliqué intéressant que vous avez ici. – Ryan

    Répondre

    8

    Une étiquette de script traditionnelle bloquera la page pendant le chargement et l'exécution. Un script chargé avec document.write fonctionnera de manière asynchrone.C'est la raison pour laquelle vous le voyez sur les annonces ou les analyses, car de tels scripts n'influencent pas directement le contenu de la page.

    +0

    Ce n'est pas vrai, vous pouvez accéder au contenu de la balise de script ajoutée immédiatement avec un 'document.write', à partir d'une nouvelle balise de script, sauf si vous spécifiez defer = true [Voici la preuve] (https: // jsfiddle.net/mendesjuan/eymsv7qc/) C'est pourquoi vous utilisez 'document.write' quand vous avez besoin d'ajouter des paramètres dynamiques au script mais que vous ne voulez pas gérer le chargement asynchrone de la création d'un noeud de script. –

    +0

    Qu'en est-il de

    2

    Je reconnais mon erreur, doc.write créés scripts sont blocage - pire que je pensais heh :) - mais comme un avoider Adblock il est vraiment faible, donc je ne peux conclure qu'il est un mécanisme de SOP pour ajouter dynamiquement params à une requête de script surutilisée.

    Utilisez la technique d'insertion DOM pour éviter les blocs de script enfants.

    +0

    C'est ce que je pensais mais étant donné que cela rend le rendu de la page plus lent dans tous mes tests, je ne peux pas croire que ce soit vrai. Les scripts en ligne et même en les ajoutant manuellement au DOM produisent tous des rendus plus rapides (en fait, document.write fait un bloc important par rapport au reste). –

    +0

    @annakata: Avez-vous un lien qui explique cela avec plus de détails? J'ai aussi des doutes sur le "blocage du contournement". –

    +0

    Non, c'est quelque chose que je suis impliqué professionnellement - j'ai vu des concurrents invoquer des techniques doc.write et avait supposé qu'il faisait partie d'une solution de blocage (puisque le reste du code correspond au modèle commun). Il s'avère que doc.write est juste * vraiment * mauvais, et je donne trop de crédit à la compétition :) – annakata

    0

    Je ne sais pas avec certitude, mais ils pourraient l'utiliser de sorte que tout le contenu sur le site est chargé et montré à l'utilisateur d'abord, puis les annonces sont chargées et affichées.

    +0

    non - Je pensais qu'au début, mais les scripts créés par doc.write * bloquaient – annakata

    0

    Pour correspondre avec cette expression régulière et à enlever est facile:

    <script type='text/javascript' src='http://addomain/someadd.js'></script> 
    

    mais l'autre est plus complexe et peut être écrit dans des formats différents.

    Je pense que c'est la raison.

    1

    Cette méthode évite de charger le script externe si le script actif est désactivé.

    +2

    si le script est désactivé aucun script sont chargés de toute façon - au moins en FF, n'ont pas testé ailleurs, mais je crois que c'est vrai – annakata

    +0

    Au moins certains navigateurs plus anciens ont fait cela. – Gumbo

    +0

    Donc, vous voulez dire que si le script actif est désactivé, il empêche le chargement du fichier? Où comme si c'était un tag de script, il serait chargé (mais pas exécuté)? –

    5

    Je travaille avec une société de publicité sur le Web, et d'après ce que j'ai entendu, certains navigateurs (ne sais pas lesquels) vous permettront de déposer des balises de script dans la page, mais ne vous permettront pas de exécuter automatiquement leur contenu. Donc, pour ce faire, vous devez casser le tag de script en morceaux afin que le navigateur ne le traite pas comme une balise de script, mais plutôt comme n'importe quelle ancienne donnée HTML. Puis, comme le DOM est traité en série, la prochaine chose qu'il évalue, après avoir écrit la balise de script est ... hé, cette balise de script que vous venez d'écrire.

    À ce stade, la balise de script est évaluée et exécutée.

    +0

    Je ne suis pas sûr d'avoir compris celui-ci. Je ne peux pas voir comment cela serait traité différemment. –

    +1

    Notre société a reçu un code similaire d'une société de publicité. Je suis d'accord avec Paul - c'est essentiellement une méthode pour réduire la probabilité que le script soit filtré/ignoré. – Mayo

    +1

    Je devrais aussi ajouter que le code que nous avons reçu était encore obscurci par la concaténation ... "" ... il était assez évident que c'était ce qu'ils faisaient. – Mayo

    5

    Souvent, ces scripts injectés de document.write sont associés à des chaînes dynamiques pour éviter la mise en cache ou pour envoyer des informations sur le client au serveur publicitaire. Je soupçonne que votre exemple a commencé comme quelque chose comme ça

    document.write("<script type='text/javascript' src='http://addomain/someadd.js?"+extrastuff+"'><\/sc" + "ript>"); 
    

    mais se est peaufiné au fil du temps, ou a été copié et modifié par quelqu'un qui ne comprenait pas le bit extrastuff. Mais comme vous l'avez écrit, il n'y a pas de différence: les deux manières que vous citez dans votre question sont fonctionnellement les mêmes.

    0

    À mon humble avis, ce n'est pas seulement inutile, mais même incorrect. Les parenthèses d'angle ne sont pas échappées, ce qui rend le document techniquement invalide HTML (même si cela fonctionnera dans tous les principaux navigateurs, car ils essaient de récupérer les erreurs des codeurs). Et dans le cas où l'on sert son site avec des pages XHMTL comme application/xml+xhtml, document.write() ne fonctionnera tout simplement pas.

    +0

    Les parenthèses d'angle n'ont pas besoin d'être échappées dans les '', habituellement échappé dans les chaînes comme '<\/script>' ou '', etc .. Aussi, depuis quand 'document.write' fonctionne-t-il en XHTML? – Ryan

    +0

    @minitech: Vous avez tort sur les deux points. Dans l'élément XHTML 'script' est défini [defined] (http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-strict.dtd_script) comme ' dans DTD - voyez-vous, c'est [PCDATA, pas CDATA] (http://stackoverflow.com/a/918464/116546). On utilise généralement '' à la place du codage d'entité manuel. Et 'document.write' n'existe pas pour' XMLDocument's, donc [jamais travaillé] (http://is.gd/VymCN5) sauf si vous avez incorrectement servi XHTML en tant que 'text/html', en demandant au navigateur de traiter est comme HTML. – drdaeman

    +0

    Les navigateurs ont-ils déjà traité différemment les documents XHTML dans les DOM? (c'est-à-dire en tant que document XML?) C'est une nouvelle pour moi. De toute façon, "les chevrons n'ont pas besoin d'être échappés dans'