Переключение Javascript с причудливого режима на стандартный

Есть ли способ переключить страницу в причудливом режиме в стандартный режим с помощью Javascript?

Например, предположим, что у меня есть следующая страница с html. Я пробовал следующее.

<html><script src="js.js"></script></html>

и следующий контент в js.js

document.open();
document.write('<!doctype html><html></html>');
document.close();

Глядя на вывод выше, я в основном пытаюсь преобразовать страницу в обычном режиме в стандартный режим, но это не работает. (установка содержимого страницы, как указано выше, в iframe отлично работает)

iframe работает

Это работает, вы делаете document.createElement('iframe') добавление в документ и вызываете iframe.contentWindow.document.write('<!doctype html>..'); на нем. К сожалению, тот же метод не работает, если я вызываю его на текущей странице.

У кого-нибудь есть работающее исправление, переключающее страницу в режиме quirksmode в стандартный режим?

EDIT: создание и добавление iframe и просто установка его высоты и ширины на 100% работает, но не является целью;)


person Lime    schedule 12.08.2011    source источник
comment
Кто в наши дни пишет HTML без доктайпа? И почему вы не можете просто отредактировать HTML, чтобы включить его?   -  person cHao    schedule 13.08.2011
comment
@Ranyos да, настройка document.write не работает, но мне смешно, что она работает, если вы создаете iframe. Интересно, почему?   -  person Lime    schedule 13.08.2011
comment
@cHao уклоняется от исходного вопроса;)   -  person Lime    schedule 13.08.2011
comment
@Lime содержимое внутри iframe находится в стандартном режиме. Не исходная страница   -  person Raynos    schedule 13.08.2011
comment
@Lime, iframe работает только внутри iframe, внешний документ останется в режиме quirksmode.   -  person bfavaretto    schedule 13.08.2011
comment
@Lime: исходный вопрос не тот, который нужно было задавать. :)   -  person cHao    schedule 13.08.2011
comment
@bfavaretto iframe должен быть окном для другого документа, но они ведут себя по-разному. Вы можете изменить тип документа iframe, но не текущую страницу.   -  person Lime    schedule 13.08.2011
comment
возможный дубликат Нужна помощь с: jquery добавляет тип документа к html   -  person cHao    schedule 13.08.2011
comment
@cHao весь сайт expressjs написан без типа документа, не совсем понимаю, почему?   -  person Lime    schedule 15.08.2011
comment
@Lime: Первое предположение, потому что разработчики не слишком умны. Слишком много проблем с режимом причуд, и каждый широко используемый браузер отключит его, если есть тип документа.   -  person cHao    schedule 15.08.2011


Ответы (3)


Браузер обычно ищет тип документа во время загрузки, чтобы определить, следует ли использовать «стандартный режим» или нет, и загружает/отрисовывает страницу на основе этого решения. Даже если бы вам удалось вставить объявление типа документа через скрипт, это не имело бы значения вовремя.

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

Как упоминалось в другом вопросе по той же теме, вы < em>может сойти с рук, переписав весь документ. По сути, (если страница все еще находится в режиме причуд), получите document.documentElement.innerHTML, а затем напишите новый документ с правильным типом документа и добавьте HTML из исходного документа. Но это вызовет кучу проблем со скриптами и тому подобным, и этого следует избегать. Идеальное решение — исправить HTML, включив в него тип документа, а не подделывать его скриптом.

person cHao    schedule 12.08.2011
comment
Ваше (связанное) решение сработало! Спасибо, чувак, не мог бы ты отредактировать свой текущий ответ или опубликовать другой. Я мог бы вообще закрыть вопрос, но вы теоретически ответили на него. - person Lime; 13.08.2011

<script>
document.open();
document.write('<!doctype html><html></html>');
document.close();
</script>

или любой вариант не будет работать, потому что тег <SCRIPT> заставляет синтаксический анализатор HTML создавать элемент HTML и элемент HEAD, если таковой не существует. К тому времени, когда существует элемент HTML (даже неявный), DOCTYPE в потоке токена игнорируется.

Закрытие и повторное открытие документа просто предотвратит синтаксический анализ любого следующего содержимого HTML.

Единственный способ использовать document.write для вывода DOCTYPE — это создать новый пустой документ, в который вы можете писать.

Просто решите эту проблему на стороне сервера.

person Mike Samuel    schedule 12.08.2011
comment
Если он действительно избавится от документа и создаст новый, как будет работать ваш скрипт? Частью очистки документа будет удаление скрипта... - person cHao; 13.08.2011
comment
Это то, что говорит в документах Mozilla. Думается, что они заслуживают доверия :| urg... Думаю, мне нужно составить новый план.... - person Lime; 13.08.2011
comment
@Lime, повторное открытие документа остановит синтаксический анализ HTML, предотвращая загрузку остальной части HTML в новый документ. В лучшем случае вы получите документ в стандартном режиме, лишенный содержимого. - person Mike Samuel; 13.08.2011
comment
Никакой контент в стандартном режиме не лучше, чем в причудливом :D, по крайней мере, для меня. - person Lime; 13.08.2011
comment
@Lime, тогда начни свой файл с <script>document.write("<noscript>");</script> :) - person Mike Samuel; 13.08.2011

Вы можете попробовать написать X-UA-совместимый метатег:

<meta http-equiv="X-UA-Compatible" content="IE=9" />
person gilly3    schedule 12.08.2011