Почему HTML1113: режим документа перезапускается из стандартов IE9 в причуды
Я открываю веб-страницу в IE9 - и внезапно режим документа переключается в режим Quirks. Сама страница предельно проста - без doctype, без мета-тэга, просто кусочек (тестового) javascript внутри xslt, формирующего страницу.
См. http://home.arcor.de/martin.honnen/xslt/test2012041901.xml используя упомянутый xsl в том же месте. Для удобства я скопировал содержимое ниже.
Содержание страницы
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test2012041901.xsl"?>
<test/>
И XSL содержит
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:my="http://example.com/my"
exclude-result-prefixes="ms my">
<xsl:output method="html" version="5.0"/>
<ms:script language="JScript" implements-prefix="my">
<![CDATA[
function tokenize (input) {
var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
var fragment = doc.createDocumentFragment();
var tokens = input.split(';');
for (var i = 0, l = tokens.length; i < l; i++)
{
var item = doc.createElement('item');
item.text = tokens[i];
fragment.appendChild(item);
}
return fragment.selectNodes('item');
}
]]>
</ms:script>
<xsl:template match="/">
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Example</h1>
<ul>
<xsl:apply-templates select="my:tokenize('Kibology;for;all')"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<li>
<xsl:value-of select="."/>
</li>
</xsl:template>
</xsl:stylesheet>
Почему это происходит? Это запускает настройку параметров Интернета? Как я могу предотвратить автоматический выбор режима причуда в IE9?
И еще: раньше на той же странице этот автоматический режим причуд не появлялся - я должен был что-то сделать, например, изменение настроек, может быть, даже просто вперед и снова вернуться к исходному значению, что привело к этому измененному поведению. Но что?
Инструменты разработчика F12 показывают следующее в консоли:
XML5001: Applying Integrated XSLT Handling.
HTML1114: Codepage unicode from (UNICODE byte order mark) overrides conflicting codepage utf-8 from (10)
test2012041901.xml
HTML1113: Document mode restart from IE9 Standards to Quirks
test2012041901.xml
HTML1114: Codepage unicode from (UNICODE byte order mark) overrides conflicting codepage utf-8 from (10)
test2012041901.xml
Не уверен, что такое сообщение с меткой порядка байтов - может быть, это связано с проблемой?
О, и инструменты разработчика также показывают это в части скрипта:
㼼浸敶獲潩㵮ㄢ〮•湥潣楤杮∽呕ⵆ∸㸿㰊砿汭猭祴敬桳敥⁴祴数∽整瑸砯汳•牨晥∽整瑳〲㈱㐰㤱砮汳㼢ਾ琼獥⽴ਾ
Обратите внимание, что все это происходит только с недавно открытыми вкладками, а не с уже существующими в режиме причуд.
2 ответа
Поскольку никто не подойдет к этому случаю, я сам отвечу на вопрос.
Как указывал в комментарии к вопросу paulsm4, именно отсутствующий тип документа запускает режим причуд. См. http://hsivonen.iki.fi/doctype/ для превосходного обзора типов документов, типов браузеров и полученных режимов браузера.
Что касается забавной цепочки азиатских иероглифов - я провел дальнейшее исследование этого и выяснил, откуда он взялся. Я открыл новый файл в UltraEdit, сначала преобразовал его из utf-8 в unicode, а затем скопировал текст. Результат в шестнадцатеричном представлении показывает все это:
Как мы видим, это всего лишь загруженный xml-файл плюс знак порядка следования байтов FF FE, который, согласно википедии, является буквой UTF-16 Little Endian:
Теперь о сообщениях в консоли: порядок событий в браузере выглядит следующим образом:
- получить файл XML
- получить указанный XSL-файл и применить преобразование (XML5001); результат процесса
- BOM = FF FE, то есть utf-16 переопределяет utf-8, упомянутый в заголовке xml (HTML1114)
- IE9 замечает отсутствующий тип документа, переключается в режим причуд (HTML1113) и снова загружает файл результатов
- Опять-таки, BOM-код переопределяет кодировку XML-заголовка (HTML1114).
- Файл отображается
Вы пытались явно установить совместимость в генерируемом HTML?
HTML5 Doctype перевод IE9 в режим причуд?
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
..