23

我在 IE9 中打开一个网页 - 突然文档模式切换到 Quirks 模式。页面本身非常简单 - 没有 doctype,没有元标记,只是形成页面的 xslt 内的一段(测试目的)javascript。
请参阅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

不确定字节顺序标记消息的全部内容 - 也许与问题有关?

哦,开发工具也在脚本部分显示了这一点:

㼼浸敶獲潩㵮ㄢ〮•湥潣楤杮∽呕ⵆ∸㸿㰊砿汭猭祴敬桳敥⁴祴数∽整瑸砯汳•牨晥∽整瑳〲㈱㐰㤱㄰砮汳㼢ਾ琼獥⽴ਾ

请注意,所有这些仅发生在新打开的选项卡上,而不是现有的处于怪癖模式的选项卡。

4

2 回答 2

20

由于没有人跳到这个场合,我将自己回答这个问题。
正如 paulsm4 在对该问题的评论中指出的那样,触发怪癖模式的是缺少的文档类型。请参阅http://hsivonen.iki.fi/doctype/以获得对文档类型、浏览器类型和生成的浏览器模式的出色概述。

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

小端

如我们所见,它只是上传的 xml 文件,加上前面的字节顺序标记 FF FE,根据维基百科,它是一个 utf-16 Little Endian 的:

字节顺序标记

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

  1. 获取 XML 文件
  2. 获取引用的 XSL 文件并应用转换 (XML5001);处理结果
  3. BOM = FF FE,即 utf-16 覆盖 xml 标头中提到的 utf-8 (HTML1114)
  4. IE9 注意到缺少 doctype,切换到 quirks 模式 (HTML1113) 并再次重新加载结果文件
  5. 同样,BOM 编码会覆盖 xml 标头编码 (HTML1114)
  6. 显示的文件
于 2012-05-08T07:34:34.193 回答
3

您是否尝试过在生成的 HTML 中明确设置兼容性?

HTML5 doctype 将 IE9 置于怪异模式?

<head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
  ..
于 2012-05-04T22:57:08.473 回答