Como saber se um navegador está no modo "peculiaridades"?

128

Suponhamos que você tenha uma página com um tipo de documento e uma marcação HTML relativamente estritos, muito próximo da conformidade, mas que talvez falhe de algumas maneiras tolas, talvez por causa do conteúdo do usuário que está fora de seu controle ... digamos que você esteja trabalhando em um conteúdo sistema de gerenciamento ou um tema para um sistema de gerenciamento de conteúdo em que você controla alguma estrutura básica e precisa de javascript, mas não é responsável por tudo o que entra nas páginas.

Como você pode dizer (ou: o que determinará) quando o navegador decide entrar no modo "peculiaridades" em vez de usar seu mecanismo mais compatível com os padrões?

Estou procurando respostas para cada um dos principais navegadores, já que o IE, o Chrome, o Safari e o Firefox irão lidar com isso de maneira diferente. Um único erro é suficiente para forçá-lo ou você tem alguma margem de manobra?

Joel Coehoorn
fonte

Respostas:

159

No Firefox e Opera, você pode determinar se o navegador está no "modo peculiar", verificando as informações da página.

Usando document.compatMode, você informará o modo em que está na maioria dos navegadores.

No Chrome, Safari e IE , execute este javascript na barra de endereço:

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

(observe que você precisará digitar novamente a javascript:parte depois de colar na barra de endereço, devido a alterações recentes na segurança)

Chris Ballance
fonte
Há outro valor potencial no IE que eu encontrei ao forçar uma página antiga no modo "EDGE". O valor era "BackCompat"
Greg Woods
Também obtive o BackCompat no Chrome ao definir DOCTYPE para algo completamente inválido. De acordo com o código nesta resposta, se o valor for diferente de CSS1Compat, ele estará no modo peculiar. Isso é mesmo verdade? Quais são todos os valores possíveis?
still_dreaming_1 16/16
Aparentemente, BackCompatible é o valor padrão para o modo "peculiaridades" / "compatibilidade". Existem apenas os 2 valores: developer.mozilla.org/pt-BR/docs/Web/API/Document/compatMode
still_dreaming_1 16/16
19

Como você pode consultar o modo de renderização em JavaScript, você pode ter um Bookmarklet que informará qual modo de renderização a página está usando.

Encontrei este bookmarklet no modo de renderização que funciona bem para mim:

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

A resposta completa para sua pergunta específica real: 'Um único erro é suficiente para forçá-lo ou você tem alguma margem de manobra?' é que depende totalmente do erro. Por exemplo,

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

forçará o modo quirks no IE 6 e 7, apesar de não ser realmente um erro (eles apenas disparam totalmente quando a primeira linha do arquivo não é uma declaração). Uma lista rápida de tipos / peculiaridades pode ser encontrada aqui

Tente colocar a seguinte linha no seu HTML para testar (comportamento javascript muito ruim que estou passando aqui - desculpe ... verifique se isso nunca entra no ar :)

<a href="javascript:alert(document.compatMode);">What mode am I?</a>
Steerpike
fonte
Obrigado pelo testador de javascript, porque minhas duas primeiras tentativas de escapar do modo peculiares não funcionaram.
Noumenon
css1compat! = modo peculiares?
Mike Cole
4

De acordo com http://www.quirksmode.org/css/quirksmode.html : "O problema era que algumas páginas escritas no modo quirks tinham doctypes. Portanto, cada navegador tem sua própria lista com doctypes que acionam o modo quirks. Veja este navegador gráfico de comparação para obter uma visão geral dessas listas: http://hsivonen.iki.fi/doctype/ "

Espero que isto ajude

Sébastien Nussbaumer
fonte
3

Se você disser ao IE que deve ser rigoroso (via doctype), ele não mudará de idéia no meio da página.

i_am_jorf
fonte
2

Se eu entendo o modo quirks corretamente, uma página que não é validada com relação ao seu doctype declarado não é suficiente para acionar o modo quirks. Apenas não será exibido corretamente.

O melhor recurso que encontrei para determinar como diferentes navegadores lidam com cada tipo de documento está aqui .

Bill the Lizard
fonte
2

Para o Firefox com a barra de ferramentas Desenvolvedor Web, você pode ver o trio de ícones à direita da barra. O da esquerda indica o modo em que você está.

Arieleo
fonte
2

No IE você o verá nas ferramentas do desenvolvedor (pressionando F12), ele diz no menu: Modo Documento: ... E você também pode forçar um modo diferente lá.

Ronen Festinger
fonte
Isso perde o objetivo da pergunta. Isso não ajuda a escrever javascript que executa um caminho para o modo quirks e um caminho diferente para o modo padrões.
Joel Coehoorn
Na verdade, você não perguntou como fazê-lo em Javascript, mas como saber em que modo o navegador usa. De qualquer forma, mesmo se você não quis dizer isso, pode ajudar outros que o procuram, eu mesmo precisava saber como conhecê-lo no Firefox e cheguei a essa pergunta.
Ronen Festinger 7/08
@JoelCoehoorn O problema real é que você nunca explicou o que é um "doctype relativamente rigoroso"!
Sr. Lister
0

na página html5, escreva " <!DOCTYPE html>" start with page pode mudar para document.compatMode = 'CSS1Compat'

Miro
fonte