Как узнать, что браузер находится в режиме «причуд»?

128

Предположим, у вас есть страница с относительно строгим типом документа и разметкой HTML, которая довольно близка к совместимости, но, возможно, пропускает несколько глупых способов, возможно, из-за пользовательского контента, который находится вне вашего контроля ... скажем, вы работаете с контентом система управления или тема для системы управления контентом, где вы контролируете некоторую базовую структуру и вам нужен некоторый javascript, но вы не несете ответственности за все остальное, что входит в страницы.

Как вы можете определить (или: что определит), когда браузер решает перейти в режим "причуд" вместо того, чтобы использовать его более совместимый со стандартами движок?

Я ищу ответы для каждого из основных браузеров, поскольку IE, Chrome, Safari и Firefox, конечно, будут обрабатывать это по-разному. Достаточно ли одной единственной ошибки, чтобы заставить это сделать это, или у вас есть некоторая свобода действий?

Джоэл Кохорн
источник

Ответы:

159

В Firefox и Opera вы можете определить, находится ли ваш браузер в «режиме причуд», проверив информацию о странице.

Использование document.compatMode, сообщит вам, в каком режиме вы находитесь в большинстве браузеров.

В Chrome, Safari и IE запустите этот javascript в адресной строке:

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

(обратите внимание, что вам нужно будет повторно ввести javascript:часть после вставки в адресную строку из-за недавних изменений безопасности)

Крис Балланс
источник
В IE есть еще одно потенциальное значение, с которым я столкнулся при переводе старой страницы в режим «EDGE». Значение было "BackCompat"
Грег Вудс
Я получил BackCompat в Chrome, когда установил для DOCTYPE что-то совершенно недопустимое. Согласно коду в этом ответе, если значение отличается от CSS1Compat, оно находится в режиме совместимости. Это действительно так? Каковы все возможные значения?
still_dreaming_1
Очевидно, BackCompatible - это стандартное значение для режима "причуд" / "совместимость". Есть только 2 значения: developer.mozilla.org/en-US/docs/Web/API/Document/compatMode
still_dreaming_1
19

Поскольку вы можете запросить режим рендеринга в JavaScript, у вас может быть букмарклет, который сообщит вам, какой режим рендеринга использует страница.

Я нашел этот букмарклет режима рендеринга, который мне подходит:

javascript:m=(document.compatMode=='CSS1Compat')?'Standards':'Quirks';window.alert('You%20are%20in%20'%20+%20m%20+%20'%20mode.');
Дэйв Уэбб
источник
11

Полный ответ на ваш конкретный вопрос: «Достаточно ли одной единственной ошибки, чтобы ее вызвать, или у вас есть некоторая свобода действий?» в том, что это полностью зависит от ошибки. Например,

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

вызовет режим причуд в IE 6 и 7, несмотря на то, что на самом деле это не ошибка (они просто вызывают полное колебание, когда самая первая строка файла не является объявлением). Краткий список типов / причуд можно найти здесь

Попробуйте вставить следующую строку в свой HTML-код для тестирования (очень плохое поведение javascript, которое я передаю здесь - извините ... убедитесь, что это никогда не будет запущено :)

<a href="javascript:alert(document.compatMode);">What mode am I?</a>
Стирпайк
источник
Спасибо за тестер javascript, потому что мои первые две попытки выйти из режима причуд не сработали.
Noumenon
css1compat! = режим причуд?
Майк Коул
4

Согласно http://www.quirksmode.org/css/quirksmode.html : «Проблема заключалась в том, что некоторые страницы, написанные в режиме совместимости, действительно имели типы документа. Поэтому каждый браузер имеет свой собственный список типов документов, запускающих режим совместимости. См. Этот браузер. сравнительная таблица для обзора этих списков: http://hsivonen.iki.fi/doctype/ "

Надеюсь это поможет

Себастьен Нуссбаумер
источник
3

Если вы скажете IE, что он должен быть строгим (через doctype), он не изменит свое мнение на полпути страницы.

i_am_jorf
источник
2

Если я правильно понимаю режим quirks, страницы, которая не проверяется на соответствие заявленному типу документа, недостаточно для запуска режима quirks. Он просто не будет правильно отображаться.

Лучший ресурс, который я нашел для определения того, как разные браузеры обрабатывают каждый тип документа, находится здесь .

Билл Ящерица
источник
2

Для Firefox с дополнительной панелью инструментов веб-разработчика вы можете посмотреть на три значка справа от панели. Крайний левый говорит вам, в каком режиме вы находитесь.

Arieleo
источник
2

В IE вы увидите это в инструментах разработчика (нажав F12), он говорит это в меню: Режим документа: ... И вы также можете принудительно установить другой режим там.

Ронен Фестингер
источник
Это упускает из виду суть вопроса. Это не поможет вам написать javascript, который выполняется по одному пути для режима причуд и по другому пути для стандартного режима.
Джоэл Кохорн
На самом деле вы спрашивали не, как это сделать в Javascript, а как узнать, какой режим использует браузер. В любом случае, даже если вы этого не имели в виду, это может помочь другим, которые его ищут, мне самому нужно было знать, как узнать это в Firefox, и я подошел к этому вопросу.
Ронен Фестингер
@JoelCoehoorn Настоящая проблема в том, что вы никогда не объясняли, что такое «относительно строгий doctype»!
Mr Lister
0

на странице html5 напишите " <!DOCTYPE html>" начало страницы может измениться на document.compatMode = 'CSS1Compat'

Miro
источник