为什么HTML1113:文档模式从IE9标准模式重启到Quirks模式?

23
我在IE9中打开了一个网页,突然文档模式切换到Quirks模式。该页面非常简单-没有doctype,没有meta标签,只有一个(test purpose)的JavaScript代码作为xslt的一部分构成了页面。
请查看使用相同位置上提到的xsl文件的http://home.arcor.de/martin.honnen/xslt/test2012041901.xml。 为方便起见,我在下面复制了内容。

页面内容是:

<?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个回答

20

由于没有人站出来回答问题,我将亲自回答这个问题。正如paulsm4在评论中所指出的那样,缺少doctype会触发怪异模式。请参阅http://hsivonen.iki.fi/doctype/以了解doctype、浏览器类型和结果浏览器模式的详细概述。

关于这串有趣的亚洲字符 - 我进一步研究了一下,并发现了它来自哪里。我在UltraEdit中打开了一个新文件,先将其从utf-8转换为unicode,然后再复制文本。在十六进制视图中的结果揭示了一切:

Little Endian

如我们所见,它只是上载的xml文件,加上一个前置字节顺序标记FF FE,根据维基百科的说法,它是一个utf-16小端字节顺序标记:

byte order mark

现在对于控制台中的消息:浏览器中事件的顺序显然如下:

  1. 获取XML文件
  2. 获取所引用的XSL文件并应用转换(XML5001);处理结果
  3. BOM = FF FE,它是utf-16,覆盖了xml头中提到的utf-8(HTML1114)
  4. IE9注意到缺少doctype,切换到怪异模式(HTML1113),然后重新加载结果文件
  5. 同样,BOM编码覆盖了xml头编码(HTML1114)
  6. 文件显示

3

不行 - 正如您所看到的 - 它只是无意中进入了怪异模式。我的问题不是如何在HTML中进行更正(而是在可能的情况下在Internet选项中),我只是不明白为什么它首先会进入怪异模式。请注意,您提供的链接是我排除的链接,因为我根本没有doctype。 - Maestro13
3
伙计,你考虑过没有使用文档类型声明会导致浏览器进入怪异模式吗?! - paulsm4
所以 - 您的意思是没有文档类型和没有元标记会触发进入怪异模式 - 总是这样吗?我没有考虑过这一点,因为我没有在任何地方遇到这个规则。我很惊讶但也很感兴趣。可惜我无法再创建一个之前未自动选择怪异模式的情况 - 我担心那时我将不得不将其视为IE9的无法解释的小问题。 - Maestro13
我终于在这里找到了有用的东西:http://hsivonen.iki.fi/doctype/。如果有人(任何人)愿意提供像“这是正常行为,请参见上面的链接xxx网站”这样的答案,那么我将接受该答案。 - Maestro13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接