¿Qué significa un script-Tag con src AND contenido?

122

Ejemplo del botón +1 de Google:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
      {"parsetags": "explicit"}
</script>

La etiqueta de script tiene un atributo src y un contenido. ¿Qué significa esto y cómo funciona?

usr
fuente
Firebug Lite utiliza este método: getfirebug.com/firebuglite
Brad

Respuestas:

71

Los diferentes navegadores tratan esto de manera diferente. Algunos ejecutan el contenido solo si srcse incluye sin error. Algunos lo ejecutan después de intentar incluir el srcscript, independientemente del éxito. Dado que este comportamiento no es confiable (y está prohibido en HTML5 ), debe evitarse.

Google no se basa en ningún comportamiento específico. Dado que el contenido es solo un objeto literal (un valor), ejecutarlo no haría nada más que provocar un error silencioso. El código de Google analiza el contenido de la scriptetiqueta en sí y ajusta su comportamiento en función de eso.

Jeremy Banks
fuente
2
¿Existe una forma más inteligente para que el script mire el contenido de su propia etiqueta de script (específicamente), que pasando por el DOM?
Karl Knechtel
11
En todos los navegadores con los que he trabajado, el contenido del script nunca se ejecutará si el srcatributo está presente, y en realidad no es realmente un objeto literal, ese código produciría un SyntaxErrorsi se ejecuta, es simplemente "texto JSON" que utilizará el script por sí mismo más tarde.
CMS
2
@Karl usado dentro de un archivo .js externo, esto le dará el contenido del nodo <script> que se está ejecutando actualmente: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; no creo que haya ninguna forma de recuperar el contenido de un nodo de script que no implique tocar el DOM .
digitalbath
@CMS funciona en todos los navegadores excepto IE. Puedes verlo aquí
Jose Faeti
1
@jose: su ejemplo no es a lo que se refería CMS. Si el código se ejecuta como una declaración independiente, es un error de sintaxis. Su ejemplo (y el de Google) "funciona" solo porque el contenido del elemento de secuencia de comandos se ignora debido al atributo src .
RobG
23

Si un elemento de secuencia de comandos tiene un atributo src , el contenido debe ignorarse, cualquier otro comportamiento no es conforme.

Se ha sugerido en blogs (como un truco) poner contenido en el elemento sabiendo que no será evaluado, luego usar métodos DOM para obtener el contenido como una cadena y evaluarlo o insertarlo en un nuevo elemento de script. Ninguno de estos es una buena idea.

RobG
fuente
4
¿Por qué no es una buena idea? ¿Qué pasa si se usa para inicializar un complemento de terceros?
thekingoftruth
13

De acuerdo con la especificación del borrador de HTML5 , los <script>elementos con srcatributos solo deben tener código comentado, que está destinado a proporcionar documentación para el script. Sin embargo, no parece que Google se ajuste a esta especificación.

Jim
fuente
13

Una vez que se ha cargado el script, busca dentro de su propia etiqueta de script para acceder a su contenido.

Utilizará un código similar a este:

var scripts = document.getElementsByTagName("script");
var data = eval(scripts[scripts.length - 1].innerHTML);

Cortesía de John Resig .

James Billingham
fuente