2010-04-24 7 views
54

Según tengo entendido, el servidor web establece los tipos de mime. ¿Por qué agregamos el atributo type="text/javascript o type="text/css"? ¿No es esto un atributo inútil e ignorado?¿Por qué escribir <script type = "text/javascript"> cuando el tipo de mime está configurado por el servidor?

+7

servidores están configurados raramente correctamente. – Gumbo

+0

También porque puede colocar cualquier tipo allí, y si el navegador puede entender ese tipo, ejecutará el script. –

+0

@Gumbo: ¿De verdad? ¿Tiene alguna prueba (es decir, algún texto que contenga estadísticas) para esto? –

Respuesta

56

Douglas Crockford says:

type="text/javascript"

Este atributo es opcional . Desde Netscape 2, el lenguaje predeterminado de programación 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.

He also says:

W3C no adoptó el atributo language , favoreciendo en cambio un atributo type que tiene un tipo MIME. Por desgracia, el tipo MIME no fue estandarizado, por lo que a veces es "text/javascript" o "application/ecmascript" o algo más. Afortunadamente, todos los navegadores seleccionarán JavaScript como el idioma de programación predeterminado, por lo que es siempre es mejor simplemente escribir <script>. Es el más pequeño, y funciona en el más navegadores.

Para fines de entretenimiento, he probado los siguientes cinco guiones

<script type="application/ecmascript">alert("1");</script> 
    <script type="text/javascript">alert("2");</script> 
    <script type="baloney">alert("3");</script> 
    <script type="">alert("4");</script> 
    <script >alert("5");</script> 

en Chrome, pero todos Script 3 (type="baloney") trabajó. IE8 no ejecutó el script 1 (type="application/ecmascript") o el script 3. En base a mi muestra no extensa de dos navegadores, parece que puede ignorar el atributo type sin problemas, pero que lo use es mejor usar un legal (dependiente del navegador) valor.

+2

Eso no cumple con la especificación HTML: http: //www.w3.org/TR/html401/interact/scripts.html#adef-type-SCRIPT –

+1

Con respecto a la segunda parte: lea más sobre los tipos MIME en RFC 4329: http://www.ietf.org/rfc/ rfc4329.txt De hecho, debería especificar 'type =" text/javascript "', aunque muchos servidores enviarán el archivo con Content-type: 'application/javascript'. –

+0

Realmente me pregunto qué hará IE 6 con estos ejemplos. Y sí, al menos el quinto (con 'type' omitido) funcionará en ese navegador. Esto se debe a que la mayoría de los navegadores tienen configuraciones de respaldo incluidas, en caso de que un documento no cumpla con los estándares; eso no es excusa para servir cosas no estándar o incluso etiquetar sopa. –

26

Porque, al menos en HTML 4.01 y XHTML 1 (.1), el atributo type para los elementos <script> es required.

En HTML 5, type ya no es necesario.

De hecho, si bien debe usar text/javascript en su fuente HTML, muchos servidores enviarán el archivo con Content-type: application/javascript. Lea más acerca de estos tipos MIME en RFC 4329.

cuenta de la diferencia entre el RFC 4329, que marcó text/javascript como obsoletas y recomendando el uso de application/javascript, y la realidad en la que algunos navegadores se asustan en <script> elementos que contienen type="application/javascript" (en código HTML, no la cabecera HTTP Content-type de el archivo que se envía). Recientemente, hubo una discusión en la lista de correo WHATWG sobre esta discrepancia (HTML 5 type por defecto text/javascript), leer estos mensajes con objeto Will you consider about RFC 4329?

5

Permite a los navegadores determinar si pueden manejar el lenguaje de scripting/estilo antes de realizar una solicitud del script o la hoja de estilo (o, en el caso del script/estilo incorporado, identificar qué idioma se está utilizando).

Esto sería mucho más importante si hubiese habido más competencia entre idiomas en el espacio del navegador, pero VBScript nunca llegó más allá de IE y PerlScript nunca pasó de ser un complemento específico de IE mientras que JSSS era bastante basura para empezar.

El borrador de HTML5 hace que el atributo sea opcional.

11

Boris Zbarsky (Mozilla), que probablemente sabe más acerca de las entrañas de Gecko que cualquier otra persona, siempre que al http://lists.w3.org/Archives/Public/public-html/2009Apr/0195.html el pseudocódigo repite a continuación para describir lo que los navegadores basados ​​en Gecko hacen:

if (@type not set or empty) { 
    if (@language not set or empty) { 
    // Treat as default script language; what this is depends on the 
    // content-script-type HTTP header or equivalent META tag 
    } else { 
    if (@language is one of "javascript", "livescript", "mocha", 
          "javascript1.0", "javascript1.1", 
          "javascript1.2", "javascript1.3", 
          "javascript1.4", "javascript1.5", 
          "javascript1.6", "javascript1.7", 
          "javascript1.8") { 
     // Treat as javascript 
    } else { 
     // Treat as unknown script language; do not execute 
    } 
    } 
} else { 
    if (@type is one of "text/javascript", "text/ecmascript", 
         "application/javascript", 
         "application/ecmascript", 
         "application/x-javascript") { 
    // Treat as javascript 
    } else { 
    // Treat as specified (e.g. if pyxpcom is installed and 
    // python script is allowed in this context and the type 
    // is one that the python runtime claims to handle, use that). 
    // If we don't have a runtime for this type, do not execute. 
    } 
} 
+1

Solo para su información, tenga en cuenta que el uso del atributo 'language' está en desuso: http://www.w3.org/TR/html401/interact/scripts.html#adef-language –

+0

¿Qué idioma es el código anterior? –

+11

@Christopher: "pseudocódigo" –

Cuestiones relacionadas