La conmutación de modo incluida en este artículo es adecuada para Firefox y otros navegadores basados en gecko, Safari, Chrome y otros navegadores, Opera, Konqueror, Internet Explorer para Mac, Internet Explorer para Windows y navegadores con IE incorporados. Evite mencionar el nombre del motor del navegador y, en su lugar, use el nombre del navegador más conocido del motor.
Este artículo se centra en el mecanismo de selección de los patrones en lugar de registrar el comportamiento exacto de cada patrón.
Aquí hay una variedad de modos diferentes:
La selección de patrones de contenido de texto/HTML depende de Doctype Sniffing (Doctype Sniffing, discutido más adelante en este artículo). En IE8, el patrón también depende de otros factores. Sin embargo, de forma predeterminada en IE8, los patrones de sitios que no son de intraneta que no se proporcionan en la lista negra de Microsoft dependen del tipo de documento.
No es una exageración enfatizar la diferencia en el comportamiento preciso de los patrones en cada navegador, incluso si hay una discusión unificada en este artículo.
En Firefox, Safari, Chrome y Opera, la aplicación/XHTML+XML Tipo de contenido HTTP (¡no un meta elemento o DOCTYPE!) Activará el patrón XML. En el patrón XML, el navegador intenta dar a los documentos XML las especificaciones correctas en la medida en que se encuentra en el navegador.
IE6, 7 y 8 no admiten aplicaciones/XHTML+XML, y también Mac IE5.
En el navegador Nokia S60 basado en WebKit, el tipo de contenido HTTP Aplicación/XHTML+XML no puede activar el esquema XML porque el enfoque en los jardines amurallados móviles es compatibilidad con contenido irregular. (Los navegadores móviles de estilo antiguo no pueden usar analizadores XML reales porque el contenido no estándar ha sido marcado XML).
Como Konqueror no se prueba completamente, no puedo decir exactamente qué sucederá en este navegador.
Los patrones que algunos motores no tienen nada que ver con el contenido web. Para completar, se mencionan aquí solamente. Opera tiene un modo WML2.0. WebKit en Leopard tiene un modo específico para los widgets de tablero heredado.
Estos son los principales efectos de estos patrones:
El patrón de texto/HTML afecta principalmente el diseño CSS. Por ejemplo, es una peculiaridad para las tablas no heredar estilos. En el modo Quirk de algunos navegadores, el modelo de caja se convierte en el modelo de caja de IE5.5. Este documento no enumera todas las peculiaridades de diseño.
Modo cuasi-estándar (en navegadores con este modo), solo las celdas de tabla que contienen imágenes difieren en modo alto y estándar.
En el esquema XML, los selectores tienen diferentes comportamientos sensibles a los casos. Además, las reglas únicas para los elementos del cuerpo HTML no se pueden aplicar a los navegadores más antiguos que no implementan los últimos cambios CSS2.1.
También hay algunas peculiaridades que afectan el análisis de HTML y CSS y causarán que las páginas web que cumplan con los estándares se analicen incorrectamente. El diseño de las peculiaridades determina si estas peculiaridades están activadas. En cualquier caso, es muy importante comprender las principales similitudes y diferencias de los patrones Quirk y los patrones estándar en el diseño y el análisis de CSS (análisis no HTML).
Algunas personas llaman erróneamente el modo de análisis estricto de modo estándar, lo que hace que las personas malinterpreten las reglas de sintaxis HTML del navegador y la evaluación del navegador de la corrección de las etiquetas. Este no es el caso. Incluso cuando el diseño del modo estándar entra en vigencia, el navegador seguirá siendo sopa de etiqueta (sopa de etiqueta, http://en.wikipedia.org/wiki/tag_soup) trabajo de corrección. (Antes de que NetScape6 se lanzara en 2000, Mozilla tenía patrones de análisis para hacer cumplir las reglas de sintaxis HTML. Estos patrones fueron abandonados incompatibles con el contenido web existente).
Otro concepto erróneo común es sobre el análisis XHTML. Por lo general, se cree que se obtienen diferentes analizados usando DOCTYPE XHTML. De hecho, este no es el caso. El tipo de contenido es el mismo que el documento analizador y HTML utilizado en el documento XHTML de Text/HTML. Lo que les importa a los navegadores en este momento es que XHTML con texto tipo documento/HTML es solo una sopa de etiqueta con crouts (cortes adicionales en todas partes).
Solo cuando se utiliza un documento de tipo de documento XML (por ejemplo: Application/XHTML+XML o XMAPPLICATION/), el analizador activará el esquema XML para el análisis. El analizador en este momento es completamente diferente del analizador HTML.
Si bien el patrón Quirk se trata principalmente de CSS, algunos se tratan de secuencias de comandos. Por ejemplo, en el patrón Quirk de Firefox, el atributo de identificación HTML establece referencias de objetos al alcance del script global al igual que en IE. El impacto de los guiones en IE8 es más digno de atención que otros navegadores.
En el esquema XML, algunas API DOM se comportan de manera completamente diferente porque el comportamiento API DOM de XML no es compatible con el comportamiento HTML cuando se define.
Los navegadores modernos usan DOCTYPE Sniffing para determinar el modo del motor de los documentos de texto/HTML. Esto significa que la elección del esquema se basa en la declaración de tipo de documento (o falta) a partir del documento HTML. (Esto no es adecuado para documentos que usan el tipo de documento XML).
La declaración de tipo de documento (DOCTYPE) es una falsificación de sintaxis de SGML. SGML es un marco de marcado de estilo antiguo. HTML antes de que HTML5 se define en función de él. En la especificación HTML4.01, la declaración de tipo de documento describe la información de la versión de HTML. Aunque el nombre es una declaración de tipo de documento y la especificación HTML 4.01 describe la información de la versión, las declaraciones de tipo de documento no se aplican para clasificar los documentos SGML o XML como tipos específicos de documentos, incluso si parece (debido al nombre). (Más contenido está en el apéndice)
Ni la especificación HTML4.01 ni ISO 8879 (SGML) dicen nada sobre el uso de declaraciones de tipo de documento como conversión del modo de motor. Doctype Sniffing se basa en la observación. Cuando se diseña el sniffing de Doctype, la mayoría de las peculiaridades no tienen declaraciones de tipo de documento o referencias a DTDS antiguos. HTML5 acepta este hecho y define a Doctype como la única conversión de modo en Text/HTML.
Una declaración típica de tipo de documento pre-HTML5 (pre-HTML5) contiene (separado por espacios en blanco) < La declaración de tipo de documento es antes de que el elemento raíz del documento inicie la etiqueta.
Aquí hay una guía simple sobre cómo elegir DOCTYPE al crear un nuevo documento de texto/HTML:
No recomiendo ningún DOCTYPE XHTML, ya que XHTML se considera perjudicial de usar como texto/HTML. De todos modos, si elige usar XHTML DOCTYPE, tenga en cuenta que la declaración de XML hace que IE6 (¡pero no IE7!) Active el patrón de Quirk.
Una guía simple para la aplicación/xhtml+xml es nunca usar DOCTYPE. Las páginas web bajo este método no son estrictamente consistentes con XHMTL1.0, pero esto no importa. (Consulte el apéndice a continuación)
Una lista aparte una vez introducida que IE8 utilizará la conversión de patrones basada en meta-elemento como uno de los factores para la selección de patrones, además de Doctype. (Ver reseñas de Ian Hickson, David Baron, David Baron nuevamente, Robert O'Callahan y Maciej Stachowiak).
Hay 4 modos para IE8: IE5.5 Modo Quirk, Modo estándar IE7, modo estándar de calidad IE8 y modo estándar IE8. La selección de modo depende de los datos de varios aspectos: Doctype, Meta Elementos, encabezados HTTP, datos de descarga regulares de Microsoft, dominios LAN, configuraciones hechas por los usuarios, la configuración realizada por los administradores de LAN, los modos del marco principal (si los hay) y el botón de vista compatible con la barra de direcciones, los usuarios son aplicados por los usuarios. (Para otras aplicaciones integradas en el motor, el patrón también depende de la aplicación integrada).
Afortunadamente, IE8 generalmente usará DOCTYPE Sniffing como otros navegadores si ocurre lo siguiente:
A excepción de los dos casos relacionados con X-UA compatible, IE8 realiza el olfato de doctype como IE7. La emulación IE7 (emulación IE7) se llama vista compatible.
En el caso de X-UA compatible, IE8 se comporta de manera completamente diferente a otros navegadores. Me gustaría ver el Apéndice o el diagrama de flujo en formatos PDF y PNG en esta página.
Desafortunadamente, no hay encabezado HTTP o metaetiqueta para X-UA compatible, e incluso con el Doctype apropiado, IE8 permite a los usuarios reducir accidentalmente la página del modo estándar de IE8 al modo IE7, que es un modo estándar IE7 simulado. Peor aún, los administradores de LAN pueden hacer lo mismo. Microsoft también puede incluir todos los nombres de dominio que use.
Para lidiar con estos efectos, DocType no es suficiente, necesita encabezado HTTP compatible con X-UA y metaeticetaje.
La siguiente guía simple es para nuevos documentos de texto/HTML que ya tienen el modo estándar de activación de Doctype o el modo cuasi-estándar en otros navegadores sobre cómo elegir el encabezado HTTP compatible con X-UA o meta etiqueta:
No traiga Doctype Sniffing a XML.
Doctype Sniffing es resolver un problema de sopa de sopa etiquetada con un método de sopa de sopa de sopa. Doctype Sniffing es un enfoque tentativo diseñado después de la liberación de especificaciones HTML4 y CSS2, que distingue documentos obsoletos de los documentos para que coincidan con los comportamientos que sus autores podrían esperar.
Ocasionalmente se sugiere usar DOCTYPE Sniffing en XML para programar un procesamiento diferente, identificar el vocabulario que se usa o activar las características. Esta es una mala idea. La programación y el reconocimiento de vocabulario deben basarse en el espacio de nombres, mientras que la activación de características debe basarse en instrucciones o elementos de procesamiento explícitos.
La idea de bien formada es introducir el análisis de DTD que permita XML y promover documentos sin doctype. En casos formales, dos documentos XML tienen la misma forma canónica y la solicitud los procesa de manera diferente (y no porque no haya otra opción para manejar entidades externas), la aplicación puede estar rota. En la práctica, si dos documentos XML causan que se reportan el mismo contenido (QNAMES Ignore) al procesador de contenido SAX2 y la aplicación procesa el documento de manera diferente, la aplicación puede estar rota. Teniendo en cuenta que, como autor web, es imposible creer que todos analizarán sus páginas utilizando XMLProcessors que abordan entidades adicionales (incluso si algunos navegadores parecen hacerlo, ya que asignan ciertos identificadores públicos a un DTD que define la entidad con un resumen), insertando DOCTYPE en XML para su uso en la Web y a menudo lleva a la carga de costo. (Todavía usa la función de anulación de DTD del validador W3C para verificar un DTD, aunque el validador W3C dirá que el resultado es solo temporal. O mejor aún, puede usar la verificación de Ng Relajante, que no contamina el documento mencionado por el patrón). Es muy tonto requerir DOCTYPE para Sniffing, incluso si eso es un trabajo en el trabajo en HTM, la práctica HTM.
Además, cuando una especificación de bajo nivel define dos cosas iguales, una especificación de alto nivel no debe tratar de darles diferentes significados. Considere <! DocType html public -// w3c // dtd xhtml 1.0 Strict // en http://www.w3.org/tr/xhtml1/dtd/xhtml1strict.dtd>. Si se elimina el identificador público, todavía se especifica el mismo DTD, por lo que el sistema DOCTYPE <! DOCTYPE HTML http://www.w3.org/tr/xhtml1/dtd/xhtml1strict.dtd> significa lo mismo que el Doctype anterior. ¿Deberían ser olfates de manera diferente? Puede ser una teoría adicional. Supongamos que copia a Ejemplo.com un DTD llamado Foobar.dtd: <! Doctype Html System http://example.com/foobar.dtd>. ¿Cómo oler esto? Debería tener el mismo significado. Incluso todo el DTD se puede publicar en el documento.
En otras palabras, si hay #include foo.h, no debe unir ninguna magia negra al nombre foo.h, ya que debería permitir la copia del contenido de foo.h en el documento o copiar foo.h en bar.h y representar #include bar.h.
La razón por la que no me preocupa HTML y SGML que construyan los mismos parámetros es que el navegador web no utiliza un analizador SGML real para analizar HTML, por lo que creo que es inútil enhebrarse como SGML para el procesamiento. De todos modos, si aún no lo cree, lea el artículo de W. Eliot Kimber sobre este asunto comp.text.sgml
En la siguiente tabla, el patrón Quirk, el patrón estándar y los criterios cuasi se representan como Q, S y A, respectivamente. Cuando el navegador tiene solo dos modos, el modo estándar está marcado como S si la altura de la fila de la celda de la tabla es consistente con el rendimiento del modo estándar de Mozilla, y el modo estándar está marcado como A si la altura de la fila de la celda de la tabla es consistente con el rendimiento del modo estándar de Mozilla.
Tenga en cuenta que el servicio XHTML utilizando el modelo de contenido XML se representa en modo XML.
El propósito de esta tabla no es decir que todos los doctypes en la tabla son opciones razonables para crear nuevas páginas. El propósito de esta tabla es mostrar en qué tipo de datos se basan mis recomendaciones.
Los siguientes símbolos de abreviatura se utilizan para títulos de columnas:
| Mordaz | NS6 | Moz viejo | Moz & Safari & Opera10 y HTML5 | Ópera9.0 | IE8 y Opera9.5 | IE7 y Opera7.10 | IE6 y Opera7.0 | Mac IE5 | Konq3.2 |
|---|---|---|---|---|---|---|---|---|---|
| Ninguno | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <! Doctype Html público -// w3c // dtd html 3.2 final // en> | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <! Doctype Html público -// w3c // dtd html 4.0 // en> | S | S | S | S | S | A | A | A | A |
| <! Doctype Html público -// w3c // dtd html 4.01 // en> | S | S | S | S | S | A | A | Q | A |
| <! Doctype Html público -// w3c // dtd html 4.0 // en http://www.w3.org/tr/html4/strict.dtd> | S | S | S | S | S | A | A | A | A |
| <! Doctype Html público -// w3c // dtd html 4.01 // es http://www.w3.org/tr/html4/strict.dtd> | S | S | S | S | S | A | A | A | A |
| <! Doctype Html público -// w3c // dtd html 4.0 transición // en> | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <! Doctype Html público -// w3c // dtd html 4.01 transición // en> | Q | Q | Q | Q | Q | Q | Q | Q | Q |
| <! Doctype Html público -// w3c // dtd html 4.01 transición // es http://www.w3.org/tr/html4/loose.dtd> | S | S | A | A | A | A | A | A | Q |
| <! Doctype Html público -// w3c // dtd html 4.01 transición // es http://www.w3.org/tr/1999/rec-html401-19991224/loose.dtd> | Q | S | A | A | A | A | A | A | Q |
| <! Doctype Html público -// w3c // dtd html 4.0 transición // es http://www.w3.org/tr/html4/loose.dtd> | Q | Q | Q | Q | A | A | A | A | Q |
| <! Doctype html public -// w3c // dtd xhtml 1.1 // en http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd> | S | S | S | S | S | A | A | A | A |
| <! Doctype html public-// w3c // dtd xhtml básico 1.0 // en http://www.w3.org/tr/xhtml-basic/xhtml-basic10.dtd> | S | S | S | S | S | A | A | A | A |
| <! Doctype html público -// w3c // dtd xhtml 1.0 Strict // en http://www.w3.org/tr/xhtml1/dtd/xhtml1strict.dtd> | S | S | S | S | S | A | A | A | A |
| <! Doctype html público -// w3c // dtd xhtml 1.0 transición // es http://www.w3.org/tr/xhtml1/dtd/xhtml1-transicional.dtd> | S | S | A | A | A | A | A | A | Q |
| <? xml versión = 1.0 encoding = utf -8?> <! Doctype html public -// w3c // dtd xhtml 1.1 // en http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd> | S | S | S | S | S | A | Q | A | Q |
| <? Xml versión = 1.0 encoding = utf-8?> <! Doctype html public-// w3c // dtd xhtml básico 1.0 // en http://www.w3.org/tr/xhtml-basic/xhtml-basic10.dtdd> | S | S | S | S | S | A | Q | A | Q |
| <? xml versión = 1.0 codificación = utf -8?> <! Doctype html public -// w3c // dtd xhtml 1.0 Strict // en en http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd> | S | S | S | S | S | A | Q | A | Q |
| <? xml versión = 1.0 codificación = utf -8?> <! Doctype html public -// w3c // dtd xhtml 1.0 transitional // es http://www.w3.org/tr/xhtml1/dtd/xhtml1-transicional.dtd> | S | S | A | A | A | A | Q | A | Q |
| <! Doctype HTML Public ISO/IEC 15445: 2000 // dtd html // en> | Q | S | S | Q | Q | Q | Q | Q | Q |
| <! Doctype HTML Public ISO/IEC 15445: 2000 // DTD Hyptext Markup Lenguaje // en> | Q | S | S | S | S | A | A | A | Q |
| <! Doctype HTML Public ISO/IEC 15445: 1999 // dtd html // en> | S | S | S | Q | Q | Q | Q | Q | Q |
| <! Doctype HTML Public ISO/IEC 15445: 1999 // Dtd Hyptext Markup Lenguaje // en> | S | S | S | S | S | A | A | A | Q |
| <! Doctype html> | Q | S | S | S | S | A | A | A |
El Código de Sniffing de Doctype de Moziila se modificó significativamente en octubre de 2000, septiembre de 2001 y junio de 2002. Los estados establecidos por Mozilla (y Netscape 6.x) descritos en este documento se pueden ver en ftp.mozilla.org desde 2000.10.19. Este documento no aborda cómo funciona Doctype Sniffing en Mozilla M18 (y Netscape 6.0 PR3). El Código de Sniffing de Doctype de Safari también se ha modificado enormemente desde la primera versión beta pública. Este documento no incluye comportamientos anteriores a la versión V73, también llamado 0.9.
El código de olfateo Doctype antes de Konqueror3.5 parece provenir de una versión temprana de Safari. Konqueror ahora coincide con Safari, y su código de olfateo Doctype proviene de Mozilla.
Como se puede ver en la mesa, el olfateo de Doctype de Opera está cambiando de un IE regular a un Mozilla, aunque Opera9.5 y 9.6 están en camino hacia atrás. Mientras tanto, el comportamiento de diseño del modo Opera Quirk se ha cambiado de imitar el modo Quirk de IE6 al modo Quirk de Mozilla.
Estos pasos se pueden ver a través de los diagramas de flujo en formatos PDF y PNG.
Gracias a Simon Pieters, Simon Pieters y Anne Van Kesteren por ayudarme a corregir las tablas de patrones y sus comentarios para varias versiones de ópera. Gracias a Simon Pieters por hacer otro diagrama de flujo IE8.