2009-02-17 25 views
18

Me preguntaba por qué el anuncio de todavía utilizan el método document.write para insertar el poner en la página¿Por qué usar document.write?

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

¿Por qué es que no puedo acaba de poner

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

En lugar del anuncio ?

+1

Interesante círculo duplicado que tienes aquí. – Ryan

Respuesta

8

Una etiqueta de script tradicional bloqueará la página mientras se está cargando y ejecutándose. Un script cargado con document.write funcionará de forma asíncrona.Es por eso que ve esto en anuncios o análisis, ya que dichos scripts no influyen directamente en el contenido de la página.

+0

Eso no es cierto, puede acceder al contenido de la etiqueta de secuencia de comandos agregada con 'document.write' inmediatamente, siempre que sea de una nueva etiqueta de secuencia de comandos, a menos que especifique defer = true [Aquí está la prueba] (https: // jsfiddle.net/mendesjuan/eymsv7qc/) Es por eso que usas 'document.write' cuando necesitas agregar algunos parámetros dinámicos al script pero no quieres tratar con la carga asíncrona de crear un nodo de script. –

+0

¿Qué pasa con

2

scripts de mi error, doc.write creé son bloqueo - peor que yo, aunque je :) - sino como una que evita Adblock Es realmente débil, por lo que sólo se puede concluir que es un mecanismo de SOP para añadir dinámicamente params a una solicitud de script usada en exceso.

Utilice la técnica de inserción DOM cuando evite secuencias de comandos para niños.

+0

Esto es lo que pensé, pero teniendo en cuenta que hace que la presentación de página sea más lenta en todas mis pruebas, no puedo creer que esto sea realmente cierto. Los scripts en línea e incluso al anexarlos al DOM manualmente producen renderizados más rápidos (de hecho document.write hace un bloque signifigante en comparación con el resto). –

+0

@annakata: ¿Tiene un enlace que explica esto con más detalles? También tengo dudas sobre el "bloqueo de elusión". –

+0

No, es algo en lo que estoy involucrado profesionalmente: he visto competidores que invocaban técnicas de doc.write y habían asumido que era parte de una solución de bloqueo (ya que el resto del código se ajusta al patrón común). Resulta que doc.write es * realmente * malo, y estoy dando demasiado crédito a la competencia :) – annakata

0

No lo sé con certeza, pero podrían usarlo para que todo el contenido del sitio web se cargue y se muestre primero al usuario, luego se cargan y se muestran los anuncios.

+0

no - pensé que al principio, pero los guiones creados doc.write * están * bloqueando – annakata

0

para que coincida con esta expresión regular y quitar es fácil:

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

pero el otro es más complejo y se puede escribir en diferentes formatos.

Creo que este es el motivo.

1

Este método evita cargar el script externo si el scripting activo está deshabilitado.

+2

si el guión está deshabilitado sin guiones se cargan de todos modos, al menos en FF, no se han probado en otro lugar, pero creo que esto es cierto – annakata

+0

Al menos algunos navegadores más antiguos lo hicieron. – Gumbo

+0

¿Quiere decir que si las secuencias de comandos activas están desactivadas, impide que se cargue el archivo? ¿Dónde, como si fuera una etiqueta de script, se cargaría (pero no se ejecutaría)? –

5

Trabajo con una empresa de publicidad en la web, y por lo que he escuchado, ciertos navegadores (no sé cuáles) le permitirán colocar etiquetas de scripts en la página, pero no le permitirán ejecuta automáticamente sus contenidos.

Por lo tanto, para lograr esto, debe dividir la etiqueta de secuencia de comandos para que el navegador no la trate como una etiqueta de secuencia de comandos, sino como cualquier dato HTML antiguo. Entonces, como el DOM se procesa en serie, lo siguiente que evalúa, después de escribir la etiqueta de script es ... hey, esa etiqueta de script que acaba de escribir.

En este punto, la etiqueta del script se evalúa y se ejecuta.

+0

No estoy seguro de captar este. No puedo ver cómo sería tratado de manera diferente. –

+1

Nuestra empresa recibió un código similar de una empresa de publicidad. Estoy de acuerdo con Paul: básicamente es un método para reducir la probabilidad de que el script se filtre/ignore. – Mayo

+1

También debería agregar que el código que recibimos estaba ofuscado con la concatenación ... "" ... lo hizo bastante obvio, eso es lo que estaban haciendo. – Mayo

5

A menudo, estos guiones de inyección de documentos tienen cadenas dinámicas adjuntas para eliminar el almacenamiento en caché o para enviar información sobre el cliente al servidor de anuncios. Sospecho que su ejemplo comenzó como algo como esto

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

pero fue ajustado con el tiempo, o se ha copiado y modificado por alguien que no entiende el bit extrastuff. Pero como lo has escrito, no hay diferencia: las dos formas en que citas en tu pregunta son funcionalmente iguales.

0

En mi humilde opinión, eso no solo es inútil, sino incluso incorrecto. Los corchetes angulares no se escapan, lo que hace que el documento sea HTML técnicamente no válido (aunque funcionará en todos los navegadores principales, ya que intentan recuperarse de los errores de los programadores). Y en caso de que uno sirva su sitio con páginas XHMTL como application/xml+xhtml, document.write(), simplemente no funcionará en absoluto.

+0

Los corchetes angulares no necesitan ser escapados en los bloques '', por lo general se escapó en cadenas como '<\/script>' o '', etc. Además, ¿desde cuándo 'document.write' no funciona en XHTML? – Ryan

+0

@minitech: Estás equivocado en ambos puntos. En el elemento XHTML 'script' está [defined] (http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-strict.dtd_script) como' 'en DTD - mírate, es [PCDATA, no CDATA] (http://stackoverflow.com/a/918464/116546). Uno usualmente usa '' en lugar de la codificación manual de la entidad. Y 'document.write' no existe para' XMLDocument's, por lo que [nunca funcionó] (http://is.gd/VymCN5) a menos que sirvió incorrectamente XHTML como 'text/html', instruyendo al navegador para tratar es como HTML. – drdaeman

+0

¿Han considerado los navegadores alguna vez los documentos XHTML de manera diferente DOM-wise? (es decir, como un documento XML?) Eso es nuevo para mí. De todos modos, "los corchetes angulares no necesitan ser escapados en '