¿Cómo saber si un navegador está en modo "peculiaridades"?

128

Supongamos que tiene una página con un doctype relativamente estricto y un marcado HTML que está muy cerca de cumplir, pero tal vez se pierda de algunas maneras tontas, tal vez debido al contenido del usuario que está fuera de su control ... digamos que está trabajando en un contenido sistema de administración o un tema para un sistema de administración de contenido en el que controlas alguna estructura básica y necesitas un poco de JavaScript, pero no eres responsable de todo lo demás que entra en las páginas.

¿Cómo puede saber (o: qué determinará) cuándo el navegador decide entrar en modo "peculiaridades" en lugar de usar su motor más compatible con los estándares?

Estoy buscando respuestas para cada uno de los principales navegadores, ya que IE, Chrome, Safari y Firefox, por supuesto, manejarán eso de manera diferente. ¿Un solo error es suficiente para forzarlo o tienes algún margen de maniobra?

Joel Coehoorn
fuente

Respuestas:

159

En Firefox y Opera , puede determinar si su navegador está en "modo peculiar" verificando la información de la página.

Utilizando document.compatMode, le dirá el modo en que se encuentra con la mayoría de los navegadores.

En Chrome, Safari e IE , ejecute este javascript en la barra de direcciones:

 javascript:window.alert('You are in ' + (document.compatMode==='CSS1Compat'?'Standards':'Quirks') + ' mode.')

(tenga en cuenta que deberá volver a escribir la javascript:parte después de pegarla en su barra de direcciones, debido a los recientes cambios de seguridad)

Chris Ballance
fuente
Hay otro valor potencial en IE que encontré cuando forcé una página antigua al modo "EDGE". El valor era "BackCompat"
Greg Woods
También obtuve BackCompat en Chrome cuando configuré DOCTYPE en algo completamente inválido. De acuerdo con el código en esta respuesta, si el valor no es CSS1Compat, está en modo peculiar. ¿Es eso realmente cierto? ¿Cuáles son todos los valores posibles?
still_dreaming_1
Aparentemente, BackCompatible es el valor estándar para el modo "peculiaridades" / "compatibilidad". Solo existen los 2 valores: developer.mozilla.org/en-US/docs/Web/API/Document/compatMode
still_dreaming_1
19

Como puede consultar el modo de representación en JavaScript, puede tener un Bookmarklet que le dirá qué modo de representación está utilizando una página.

Encontré este bookmarklet en modo render que me funciona bien:

javascript:m=(document.compatMode=='CSS1Compat')?'Standards':'Quirks';window.alert('You%20are%20in%20'%20+%20m%20+%20'%20mode.');
Dave Webb
fuente
11

La respuesta completa a su pregunta específica real de '¿Es un solo error suficiente para forzarlo o tiene algún margen de maniobra?' es que depende totalmente del error. Por ejemplo,

<!-- Comment -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

forzará el modo caprichos en IE 6 y 7 a pesar de no ser realmente un error (simplemente arrojan un tambaleo total cuando la primera línea del archivo no es una declaración). Puede encontrar una lista rápida de tipos / peculiaridades aquí

Intente pegar la siguiente línea en su HTML para probar (muy mal comportamiento de JavaScript que paso aquí - lo siento ... asegúrese de que esto nunca se active :)

<a href="javascript:alert(document.compatMode);">What mode am I?</a>
Steerpike
fuente
Gracias por el probador de JavaScript, porque mis dos primeros intentos de escapar del modo peculiar no funcionaron.
Noumenon
css1compat! = modo peculiar?
Mike Cole
4

De acuerdo con http://www.quirksmode.org/css/quirksmode.html : "El problema era que algunas páginas escritas en modo peculiar tenían doctypes. Por lo tanto, cada navegador tiene su propia lista con doctypes que activan el modo peculiar. Vea este navegador tabla de comparación para obtener una descripción general de estas listas: http://hsivonen.iki.fi/doctype/ "

Espero que esto ayude

Sébastien Nussbaumer
fuente
3

Si le dice a IE que debe ser estricto (a través de doctype), no cambiará de opinión a la mitad de la página.

i_am_jorf
fuente
2

Si entiendo correctamente el modo de peculiaridades, una página que no se valida contra su tipo de documento declarado no es suficiente para activar el modo de peculiaridades. Simplemente no se mostrará correctamente.

El mejor recurso que he encontrado para determinar cómo los diferentes navegadores manejan cada tipo de documento está aquí .

Bill el lagarto
fuente
2

Para agregar Firefox con Web Developer Toolbar, puede ver el trío de iconos a la derecha de la barra. El que está más a la izquierda te dice en qué modo estás.

Arieleo
fuente
2

En IE lo verá en las herramientas del desarrollador (presionando F12), lo dice en el menú: Modo de documento: ... Y también puede forzar un modo diferente allí.

Ronen Festinger
fuente
Esto pierde el punto de la pregunta. Eso no lo ayuda a escribir javascript que se ejecuta en una ruta para el modo peculiar y una ruta diferente para el modo estándar.
Joel Coehoorn
En realidad, no preguntaste cómo hacerlo en Javascript, sino cómo saber qué modo usa el navegador. De todos modos, incluso si no lo dijiste en serio, puede ayudar a otros que lo buscan, yo mismo necesitaba saber cómo saberlo en Firefox y llegué a esta pregunta.
Ronen Festinger el
@JoelCoehoorn ¡El problema real es que nunca explicaste qué es un "doctype relativamente estricto"!
Sr. Lister el
0

en la página html5, escriba " <!DOCTYPE html>" comenzar con la página puede cambiar a document.compatMode = 'CSS1Compat'

Miró
fuente