我正在构建的应用程序正在生成XHTML文档,这些文档将以多种不同方式分发,包括电子邮件。我可以在Firefox或Chrome中打开这些文档(“打开”我的意思是从Windows资源管理器,而不是通过Web服务器)。但是,对于IE 7,我有两个 - 可能是三个 - 不同的问题。
如果文件以扩展名“.xhtml”命名,则IE启动然后关闭。有时它仍然在任务管理器中运行,我必须杀死它。有时不会。
如果我用扩展名“.htm”或“.html”命名它们,那么它们会正常打开,除了IE信息栏出现告诉我它已阻止某种内容。这些文档不包含任何脚本或iframe或对象 - 它们可以像普通的XHTML一样。他们甚至不引用外部CSS。
当我正在开发这个文档的客户打开他的环境中的文档时(他此时只使用“.xhtml”扩展名),IE打开它们并将它们呈现为XML文档。
我花了相当多的时间在谷歌上试图找到它的底部,我发现的所有内容都与在HTTP标题中指定MIME类型有关,这对我来说并不是特别有用。我实际上并没有提供这些文件。
所有(似乎)文件都有正确的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">
有什么想法吗?
答案 0 :(得分:5)
所以,有趣的故事。 IE7 doesn't actually support strict XHTML。
具体来说,如果您使用内容类型为application/xhtml+xml
的XHTML服务,那么它将会变成“哦,那些新奇的XHTML内容,我对此一无所知”,并会将其视为一个XML文档。另一方面,如果您使用内容类型text/html
为XHTML提供服务,那么,“这种HTML味道很有趣,但我可以把它搞砸。”
有一个非凡的黑客 - suggested by the W3C, no less - 让IE渲染它认为是HTML内容的HTML内容。您基本上将仅IE xsl:stylesheet
处理指令添加到文档中,并引用输出类型为HTML的XSLT标识转换。其他浏览器忽略它; IE将其认为是XML文档(自身)转换为HTML,然后将其呈现为HTML。我不知道这个黑客是否会感到印象深刻或震惊。
但是,只有在文档可以解析对转换的引用时,该hack才有效。打开这些文档附加到的电子邮件的人不一定能够这样做。我想有一种方法可以将转换包含在XML本身中,但我已经花费了太多时间。如果我能得到正确的答案,我会花更多的时间,但这只会让我得到一种不同的错误答案。
所以我要做愚蠢的事情,并命名扩展名为.htm的文件。注册表设置将文件扩展名映射到内容类型因此.htm扩展名为text/html
,.xhtml扩展名为application/xhtml+xml
。 IE以及使用注册表来确定内容类型的所有其他内容,将这些文档视为text/html
,并且它们将呈现,并且整个过程将或多或少地起作用。但我对此并不满意。
答案 1 :(得分: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行结尾(至少在第一行)才能使用此功能。啊。
答案 2 :(得分:0)
查看Windows注册表的.html
部分中的HKEY_CLASSES_ROOT
条目:然后尝试克隆此条目以生成相应的.xhtml
条目。
<
关于如何搞乱注册表的标准免责声明 >
答案 3 :(得分:0)
你可以尝试将它们保存为.html,但在head部分添加一个元行,将内容描述为HTMl而不是活动的东西:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />