Jak sprawdzić, czy przeglądarka jest w trybie „dziwactw”?

130

Załóżmy, że masz stronę ze stosunkowo ścisłym typem dokumentu i znacznikami HTML, które są dość bliskie zgodności, ale być może brakuje na kilka głupich sposobów, być może z powodu zawartości użytkownika, na którą nie masz kontroli ... powiedzmy, że pracujesz nad treścią system zarządzania lub motyw systemu zarządzania treścią, w którym kontrolujesz podstawową strukturę i potrzebujesz trochę javascript, ale nie jesteś odpowiedzialny za wszystko inne, co znajduje się na stronach.

Jak możesz stwierdzić (lub: co to określi), kiedy przeglądarka zdecyduje się przejść w tryb „dziwactw” zamiast używać silnika bardziej zgodnego ze standardami?

Szukam odpowiedzi dla każdej z głównych przeglądarek, ponieważ IE, Chrome, Safari i Firefox będą oczywiście obsługiwać to inaczej. Czy wystarczy jeden błąd, aby to wymusić, czy też masz jakąś swobodę?

Joel Coehoorn
źródło

Odpowiedzi:

159

W Firefoksie i Operze możesz określić, czy Twoja przeglądarka jest w „trybie dziwactw”, sprawdzając informacje o stronie.

Użycie document.compatModepowie Ci tryb, w którym pracujesz w większości przeglądarek.

W przeglądarce Chrome, Safari i IE uruchom ten skrypt javascript na pasku adresu:

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

(pamiętaj, że javascript:po wklejeniu do paska adresu musisz ponownie wpisać tę część ze względu na ostatnie zmiany zabezpieczeń)

Chris Ballance
źródło
W IE jest jeszcze jedna potencjalna wartość, na którą natknąłem się, wymuszając na starej stronie tryb „EDGE”. Wartość to „BackCompat”
Greg Woods
Dostałem również BackCompat w Chrome, ustawiając DOCTYPE na coś całkowicie nieprawidłowego. Zgodnie z kodem w tej odpowiedzi, jeśli wartość jest inna niż CSS1Compat, jest w trybie dziwactw. Czy to prawda? Jakie są wszystkie możliwe wartości?
still_dreaming_1
Najwyraźniej BackCompatible jest standardową wartością dla trybu "dziwactwa" / "zgodności". Istnieją tylko 2 wartości: developer.mozilla.org/en-US/docs/Web/API/Document/compatMode
still_dreaming_1
19

Ponieważ możesz zapytać o tryb renderowania w JavaScript, możesz mieć Bookmarklet, który powie ci, jakiego trybu renderowania używa strona.

Znalazłem ten bookmarklet trybu renderowania, który działa dobrze dla mnie:

javascript:m=(document.compatMode=='CSS1Compat')?'Standards':'Quirks';window.alert('You%20are%20in%20'%20+%20m%20+%20'%20mode.');
Dave Webb
źródło
11

Pełna odpowiedź na Twoje konkretne pytanie: „Czy wystarczy jeden błąd, aby go wymusić, czy masz jakąś swobodę?”. jest to, że zależy to całkowicie od błędu. Na przykład,

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

wymusi tryb dziwactwa w IE 6 i 7, mimo że tak naprawdę nie jest błędem (po prostu rzucają całkowite wahanie, gdy pierwsza linia pliku nie jest deklaracją). Krótką listę typów / dziwactw można znaleźć tutaj

Spróbuj umieścić następujący wiersz w kodzie HTML do testów (bardzo źle zachowuje się javascript, które tu przekazuję - przepraszam ... upewnij się, że to nigdy nie zostanie opublikowane :)

<a href="javascript:alert(document.compatMode);">What mode am I?</a>
Steerpike
źródło
Dzięki za tester javascript, ponieważ moje pierwsze dwie próby wyjścia z trybu dziwactw nie zadziałały.
Noumenon,
css1compat! = tryb dziwactwa?
Mike Cole
4

Według http://www.quirksmode.org/css/quirksmode.html : „Problem polegał na tym, że niektóre strony napisane w trybie dziwactw miały doctypy. Dlatego każda przeglądarka ma własną listę z typami dokumentów, które uruchamiają tryb dziwactw. Zobacz tę przeglądarkę tabela porównawcza zawierająca przegląd tych list: http://hsivonen.iki.fi/doctype/

Mam nadzieję że to pomoże

Sébastien Nussbaumer
źródło
3

Jeśli powiesz IE, że powinien być ścisły (poprzez doctype), nie zmieni zdania w połowie strony.

i_am_jorf
źródło
2

Jeśli poprawnie rozumiem tryb dziwactw, strona, która nie jest sprawdzana pod kątem zadeklarowanego typu dokumentu, nie wystarczy, aby uruchomić tryb dziwactw. Po prostu nie wyświetli się poprawnie.

Najlepsze źródło informacji, które znalazłem, do określenia, jak różne przeglądarki obsługują każdy typ dokumentu, znajduje się tutaj .

Bill the Lizard
źródło
2

W przeglądarce Firefox z dodatkiem Web Developer Toolbar możesz spojrzeć na trzy ikony po prawej stronie paska. Pierwszy z lewej mówi ci, w jakim trybie jesteś.

Arieleo
źródło
2

W IE zobaczysz to w narzędziach programistycznych (naciśnięcie F12), mówi to w menu: Tryb dokumentu: ... I możesz tam również wymusić inny tryb.

Ronen Festinger
źródło
To mija się z celem pytania. To nie pomaga w pisaniu javascript, który wykonuje jedną ścieżkę w trybie dziwactw i inną ścieżkę w trybie standardów.
Joel Coehoorn
Właściwie nie pytałeś, jak to zrobić w Javascript, ale jak dowiedzieć się, jakiego trybu używa przeglądarka. W każdym razie, nawet jeśli nie miałeś tego na myśli, może to pomóc innym, którzy go szukają, sam musiałem wiedzieć, jak to wiedzieć w Firefoksie i dotarłem do tego pytania.
Ronen Festinger
@JoelCoehoorn Problem polega na tym, że nigdy nie wyjaśniłeś, czym jest „stosunkowo surowy typ dokumentu”!
Pan Lister
0

na stronie html5 wpisz „ <!DOCTYPE html>” początek strony może zmienić się na document.compatMode = 'CSS1Compat'

Miro
źródło