我正在构建的应用程序正在生成XHTML文档,这些文档将以多种不同方式分发,包括电子邮件.我可以在Firefox或Chrome中打开这些文档("打开"我的意思是从Windows资源管理器,而不是通过Web服务器).但是,对于IE 7,我有两个 - 可能是三个 - 不同的问题.
如果文件以扩展名".xhtml"命名,则IE启动然后关闭.有时它仍然在任务管理器中运行,我必须杀死它.有时不是.
如果我用扩展名".htm"或".html"命名它们,那么它们会正常打开,除了IE信息栏出现告诉我它已经阻止了某种内容.这些文档不包含任何脚本或iframe或对象 - 它们可以像普通的XHTML一样.他们甚至不参考外部CSS.
当我正在开发这个用户的客户在他的环境中打开文档时(他此时只使用".xhtml"扩展名),IE打开它们并将它们呈现为XML文档.
我花了相当多的时间在Google上试图找到它的底部,我在那里发现的一切都与在HTTP标题中指定MIME类型有关,这不是特别有用,因为我实际上并不是提供这些文件.
所有(似乎)文件都具有正确的DOCTYPE,处理指令和命名空间声明; 每个的顶部看起来像这样:
有任何想法吗?
好吧,有趣的故事. IE7实际上并不支持严格的XHTML.
具体来说,如果您使用内容类型为XHTML提供服务application/xhtml+xml
,它将会是"哦,那些新奇的XHTML内容,我对此一无所知",并将其视为XML文档.另一方面,如果你用内容类型的XHTML服务它text/html
,它会说,"这种HTML味道有点好笑,但我可以把它搞砸了."
有一个非常好的黑客 - W3C建议,不要少 - 让IE渲染它认为XML内容的HTML.您基本上只将IE xsl:stylesheet
处理指令添加到文档中,并引用输出类型为HTML的XSLT标识转换.其他浏览器忽略它; IE将其认为是XML文档(自身)转换为HTML,然后将其呈现为HTML.我不知道这个黑客是否会感到印象深刻或震惊.
但是,只有在文档可以解析对转换的引用时,该hack才有效.打开这些文档附加到的电子邮件的人不一定能够这样做.我想有一种方法可以将转换包含在XML本身中,但我已经花费了太多时间.如果能让我得到正确的答案,我会花更多的时间,但这只会让我得到一个不同的错误答案.
所以我要做愚蠢的事情,并命名扩展名为.htm的文件.注册表设置将文件扩展名映射到内容类型 所以.htm扩展意味着text/html
,而.xhtml扩展意味着application/xhtml+xml
.IE以及使用注册表来确定内容类型的所有其他内容,都将这些文档视为text/html
,并且它们将呈现,并且整个事情或多或少都会起作用.但我对它并不满意.