【问题标题】:How do I get IE 7 to open XHTML files?如何让 IE 7 打开 XHTML 文件?
【发布时间】:2009-02-04 20:03:25
【问题描述】:

我正在构建的一个应用程序正在生成 XHTML 文档,这些文档将以多种不同的方式分发,包括电子邮件。我可以在 Firefox 或 Chrome 中打开这些文档(“打开”是指从 Windows 资源管理器,而不是通过 Web 服务器)。但是,对于 IE 7,我遇到了两个(可能是三个)不同的问题。

如果文件以扩展名“.xhtml”命名,则 IE 启动然后关闭。有时它仍在任务管理器中运行,我必须杀死它。有时不会。

如果我用扩展名“.htm”或“.html”命名它们,那么它们可以正常打开,除了 IE 信息栏出现告诉我它已经阻止了某种内容。这些文档不包含任何脚本、iframe 或对象——它们尽可能是普通的 XHTML。他们甚至不引用外部 CSS。

当我为其开发此功能的客户在 他的 环境中打开文档时(此时他只是使用“.xhtml”扩展名),IE 会打开它们并将它们呈现为 XML 文档。

我在 Google 上花费了相当多的时间来尝试了解这一点,而我发现的所有内容都与在 HTTP 标头中指定 MIME 类型有关,这对我来说并不是特别有用m 实际上并未提供这些文件。

所有(似乎)文件都有正确的 DOCTYPE、处理指令和命名空间声明;每个的顶部看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

有什么想法吗?

【问题讨论】:

    标签: internet-explorer xhtml


    【解决方案1】:

    所以,有趣的故事。 IE7 doesn't actually support strict XHTML

    具体来说,如果你为它提供内容类型为 application/xhtml+xml 的 XHTML,它会变成“哦,那个新奇的 XHTML 东西,我对此一无所知”,并将其视为 XML文档。另一方面,如果你为它提供内容类型为 text/html 的 XHTML,它会说,“这个 HTML 味道有点好笑,但我能忍住。”

    有一个了不起的 hack - suggested by the W3C, no less - 让 IE 将它认为的 XML 内容呈现为 HTML。您基本上将 IE-only xsl:stylesheet 处理指令添加到文档并引用具有 HTML 输出类型的 XSLT 身份转换。其他浏览器忽略它; IE 将它认为是 XML 文档的内容(对其自身)进行转换,然后将其呈现为 HTML。我不知道是对这种黑客行为印象深刻还是感到震惊。

    但只有当文档可以解析对转换的引用时,该技巧才有效。打开附有这些文档的电子邮件的人不一定能够执行此操作。我想有一种方法可以将转换包含在 XML 本身中,但我已经在这方面花费了太多时间。如果它让我得到正确的答案,我会花更多的时间,但这只会让我得到不同的错误答案。

    所以我要做一件愚蠢的事情,并用 .htm 扩展名命名文件。注册表设置将文件扩展名映射到内容类型。所以.htm 扩展名表示text/html,.xhtml 扩展名表示application/xhtml+xml。 IE,以及使用注册表来确定内容类型的所有其他东西,会将这些文档视为text/html,它们会呈现,整个事情或多或少都会起作用。但我对此并不满意。

    【讨论】:

    • xsl:stylesheet 不仅限于 IE,它是调用 XSLT 的标准方式。尽管如此,IE 仍然处于 HTML 模式,并且诸如 CSS 区分大小写和 JavaScript DOM 调用之类的东西不会像您期望的 XML 文档那样工作。避免;坚持使用 XHTML-as-.html。
    • 我知道 xsl-stylesheet PI 有一些奇怪的地方,但我记错了什么:W3C 的文档本质上说,“这是一个黑客,一旦我们弄清楚如何这个功能真的应该设计。”
    【解决方案2】:

    IE 打开它们并将它们呈现为 XML 文档。

    这很正常。如果您想将 XHTML 作为文件分发以在 IE 中查看,您将不得不坚持使用 .html。

    我不知道您的设置出了什么问题,也许是文件关联混乱?

    如果我用扩展名“.htm”或“.html”命名它们,那么它们可以正常打开,除了 IE 信息栏出现告诉我它已阻止某种内容。

    好奇。在您确定 IE 到底认为什么是活动内容之前,请尝试插入 Mark Of The Web 来安抚 IE。这需要丢失 XML 序言,但无论如何这只是使用默认值,所以包括它并没有得到任何东西。

    <!-- saved from url=(0014)about:internet -->
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    

    请注意,您必须使用 CRLF 行尾(至少在第一行)才能正常工作。呃。

    【讨论】:

    • Web 的标志(真的,微软?真的吗?)对这个特定问题没有任何影响,很遗憾。
    • 您是说即使使用了 Web 标记,您仍然会收到“活动内容被阻止”?撇开 MotW 概念的可怕性不谈,这不应该发生。 IE 说文件在哪个区域? (应该是“互联网区”。)
    【解决方案3】:

    查看 Windows 注册表的 HKEY_CLASSES_ROOT 部分中的 .html 条目:然后尝试克隆它以创建对应的 .xhtml 条目。

    &lt;标准免责声明,说明弄乱注册表是多么危险&gt;

    【讨论】:

    • 不仅危险,而且我必须在通过电子邮件将这些文档发送到的每台机器上都这样做。而且(见我的回答),已经有一个.xhtml 条目。
    【解决方案4】:

    您可以尝试将它们保存为 .html,但在头部部分添加一个元行,将内容描述为 HTMl 而不是活动的内容:

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    

    【讨论】:

    • 很遗憾(请参阅我的回答),当浏览器开始检查此标签时,问题“她是还是不是 text/html?”已经回答了。
    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多