¿Necesita el texto / javascript especificado en sus etiquetas <script>?

157

Leí en alguna parte que ya no necesitas cosas como cosas type="text/javascript"raras CDATAy <!--cosas en tus etiquetas de script. Entonces, en lugar de:

<script type="text/javascript">
//<![CDATA[
<!--

    //your script here

-->
//]]>
</script>

Simplemente harías:

<script>
    //your script here
</script>

Sin embargo, no recuerdo dónde leí esto. Creo que fue de un ingeniero de Google o Yahoo, y mencionaron específicamente qué navegadores requerían estas construcciones arcaicas y por qué. ¿Alguien sabe de qué publicación / artículo del blog se habló, o tiene un buen recurso para hablar de esto?

cmcculloh
fuente
Para los nuevos navegadores, pero en los más antiguos (si aún existen) se necesita <! - ->. Sobre el tipo en algunas aplicaciones si no se omite, necesita la correcta.
Bakudan
1
Buena lectura sobre CDATA: stackoverflow.com/questions/66837/…
kapa
1
Cada vez que abro un archivo text/javascriptespecificado, lo elimino. Es ruido.
The Muffin Man
Una publicación muy relacionada aquí con información actualizada sobre las directrices HTML5 en la respuesta aceptada.
RBT

Respuestas:

135

Vea el artículo de Crockford en la <script>etiqueta , más notablemente:

No uses el <!-- //-->hack con scripts. Estaba destinado a evitar que los scripts se muestren como texto en los navegadores de primera generación Netscape 1 y Mosaic. No ha sido necesario por muchos años. <!-- //-->se supone que señala un comentario HTML. Los comentarios deben ser ignorados, no compilados y ejecutados. Además, los comentarios HTML no deben incluirse --, por lo que un script que disminuye tiene un error HTML.

...

type="text/javascript"

Este atributo es opcional. Desde Netscape 2, el lenguaje de programación predeterminado en todos los navegadores ha sido JavaScript. En XHTML, este atributo es obligatorio e innecesario. En HTML, es mejor dejarlo fuera. El navegador sabe qué hacer.

bdukes
fuente
75
Requerido e innecesario? ¿Me estoy perdiendo de algo?
Izkata
17
@Izkata, se requiere para la validación, pero no tiene ningún efecto.
bdukes
14
"El navegador sabe qué hacer" ... por ahora. ¿Qué pasa con la próxima semana cuando RubyScript (lo inventé como ejemplo) se populariza y todos se ponen los pantalones para adoptarlo? Este es el mismo tipo de pensamiento miope que hace que las personas nombren sus archivos "_nuevo" y confunda a otras personas durante años. ¿Es el "nuevo"? O "_nuevo_nuevo"? O mas nuevo"? OMI es miope.
Slobaum
18
@Slobaum, la especificación HTML5 establece que el valor predeterminado es JavaScript . Si hay nuevos tipos de script, solo se implementarán en nuevas versiones del navegador que admitan ese valor predeterminado de la especificación.
bdukes
8
si se RubyScriptvuelve popular, terminará en .rbscripty el navegador actuará en consecuencia.
Kirk Strobeck
45

Es una recomendación de Crockford . Sé que lo he visto repetido en otro lugar (¿ppk tal vez?). La especificación HTML5 no lo requiere.

Curiosamente, se ha vuelto un tanto au courant usar el atributo "type" para marcar <script>bloques que no desea que se evalúen:

<script type='text/html-template'>
  <div> this is a template </div>
</script>

Al dar un tipo extraño que no sea JavaScript, obtienes una forma de insertar texto sin procesar en la página para que lo use otro código JavaScript (que presumiblemente está en un bloque de script que se puede evaluar).

Puntiagudo
fuente
No puedo entender completamente. explique qué type="text/html"significa en absoluto y qué text/javascriptsignifica ... gracias
T.Todua
44
@tazotodua no es realmente muy importante lo que significa "texto / html"; lo importante es que es no "text / javascript", los navegadores ignoran completamente el contenido del <script>bloque. Sin embargo, <script> se convertirá en parte del DOM, por lo que otros códigos JavaScript pueden encontrarlos y extraer sus contenidos.
Puntiagudo
Ese es un truco interesante. Sin embargo, no estoy seguro de para qué lo usaría.
brennanyoung 02 de
2
w3schools : In HTML5, the type attribute is no longer required for JavaScript. The default value is "application/javascript".
Amin Soheyli
19

HTML5 no necesita el type="text/javascript"(es el predeterminado).

CDATA solo es necesario para páginas XHTML, si el script tiene caracteres HTML (como '<' y '>').

<!-- solo debería ser necesario para navegadores antiguos.

Cohete Hazmat
fuente
3

El tipo atributo identifica el lenguaje de script del código incrustado dentro de un elemento de script o referenciado a través del atributo src del elemento. Esto se especifica como un tipo MIME; Entre los ejemplos de tipos MIME compatibles se incluyen text / javascript, text / ecmascript, application / javascript y application / ecmascript.

De acuerdo con la especificación HTML 4.01

El atributo type especifica el lenguaje de script del contenido del elemento y anula el lenguaje de script predeterminado. El lenguaje de secuencias de comandos se especifica como un tipo de contenido (por ejemplo, "texto / javascript"). Los autores deben proporcionar un valor para este atributo. No hay un valor predeterminado para este atributo.

Pero en HTML5 text/javascript es el tipo predeterminado, por lo que puede omitir

El atributo type proporciona el idioma del script o el formato de los datos. Si el atributo está presente, su valor debe ser un tipo MIME válido. El parámetro charset no debe especificarse. El valor predeterminado, que se usa si el atributo está ausente, es "text / javascript".

Mithun Sreedharan
fuente
1
en otras palabras, omitirlo podría causar errores en los navegadores antiguos que no admiten HTML5
Serge
2

puede estar pensando en este artículo aquí, con la dependencia de que los scripts predeterminan automáticamente a texto / javascript en HTML5, mientras que los navegadores que no son HTML5 todavía esperan que defina el tipo específicamente en cuanto a las especificaciones, aunque casi siempre adivinarán texto / javascript de todos modos .

Padre tormenta
fuente
1

depende del navegador interpretar el scriptbloque correctamente en función de los encabezados, creo, y no del typeatributo. Entonces, para responder a su pregunta, no, no es necesario para los navegadores modernos (estoy hablando de IE7 +, FF, Webkit). Si admite navegadores más antiguos que eso ... lo siento por usted =)

hellatan
fuente
2
No se olvide de China con más de 385 millones de usuarios, muchos de los cuales todavía usan IE6. netmarketshare.com/…
cadena el
3
conociendo la estricta política de internet de China, es probable que su sitio nunca llegue a ellos = P
hellatan
La pregunta es sobre un script en línea, por lo que no hay encabezados que no sean la página principal (que sería algún tipo de contenido HTML). De todos modos, ¿tiene una fuente que indique que los navegadores tienen en cuenta los encabezados (por ejemplo, si tiene <script src = "something"> </script> y sirve un encabezado VBScript, ¿hay algún navegador que lo interprete como VBScript) ?
Matthew Flaschen
1

Si coloca una etiqueta de script dentro de SVG , debe especificar el atributo type. Y debería ser "text/ecmascript"más que"text/javascript" .

Si su secuencia de comandos está en línea (no vinculada), también deberá incluir el cuerpo de la secuencia de comandos en una declaración CDATA. Por lo tanto, la plantilla de secuencia de comandos en línea para SVG (y otras variantes XML) es

<script type="text/ecmascript">
<![CDATA[
// your javascript code goes here
]]>
</script>

Estos pueden ser casos especiales 'en la naturaleza', pero son lo suficientemente reales y el uso de SVG está creciendo, por lo que es incorrecto que alguien sugiera que el atributo type y CDATA son completamente obsoletos en los navegadores modernos. Los casos de uso son estrechos, sí, pero no desconocidos.

"Cambia el ambiente a su opuesto y cada sabiduría se convierte en la peor de las tonterías". - Ashby

brennanyoung
fuente
1
Buena llamada. ¡Acabo de trabajar en algunos SVG complejos y este es el caso!
Dave Everitt el
1

Specification La especificación HTML5 insta a los autores a omitir el atributo en lugar de proporcionar un tipo MIME redundante. MDN

El estándar MIME Sniffing permite que JavaScript se sirva utilizando cualquier tipo MIME ( Extensiones multipropósito de correo de Internet ) que coincida con lo siguiente:

<script type="application/javascript"></script>
<script type="application/ecmascript"></script>

<script type="text/javascript"></script>
<script type="text/ecmascript"></script>
Andy Young
fuente
0

Bueno, sigo viendo más ejemplos sin el texto / javascript, pero por alguna razón mis scripts no funcionarán en FF cuando lo haga. Recomendaría mantener la declaración text / javascript. La etiqueta CDATA evita que javascript se muestre como texto sin formato en su sitio web si su navegador tiene javascript desactivado. Personalmente, ya no uso esas etiquetas, no creo que haya una gran cantidad de usuarios sin ellos y, si están allí, tal vez quieran cultivar algunos cerebros: P

Miguel
fuente
Ni el atributo type ni el viejo CDATA son necesarios a menos que realmente desee apuntar a navegadores verdaderamente antiguos. Sin embargo, no deberían dañar nada, siempre y cuando realmente use el tipo correcto.
Pointy
Estoy usando la versión FF estable más reciente y parece tener problemas para analizar sin la declaración de texto / javascript, uso jQuery por cierto, pero eso no debería hacer la diferencia.
Michael
Bueno, ejecuto toda mi aplicación web con etiquetas de script que son simples <script>, sin "idioma" y sin "tipo", y funcionan bien en todos los navegadores. (Bueno, todos los razonables: FF, Chrome, Safari, IE, Opera.)
Pointy
1
@pointy parece que FatherStorm acaba de publicar una respuesta a por qué sucede esto. entonces sus comentarios parecen ser incorrectos.
Michael
@ Michael puede ser el caso de que si cometió el error de usar XHTML / Strict podría tener un problema, pero aun así lo dudo. Existe un acuerdo general entre las luminarias del mundo de JavaScript de que el atributo "tipo" es innecesario y, de hecho, dado que un "tipo" malo romperá un script, es solo una fuente de errores.
Pointy
0

type="text/javascript" : Requerido en HTML 4 y XHTML, pero opcional en HTML5.

CDATA : Requerido en XHTML.

<!--: Se utiliza para ocultar JavaScript de navegadores muy antiguos. Por ejemplo: Netscape 1 e Internet Explorer 2, ninguno de los cuales usa más.

Blesson Jose
fuente