如何在不破坏Chrome的情况下向Internet Explorer提供XHTML?


8

我经营一个论坛,其网页为XHTML + MathML + SVG;在全:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd">

使用MathPlayer插件,Internet Explorer用户可以使用此站点。但是,有时有人正在使用IE中的论坛,但无法安装MathPlayer(也许他们在某个地方的公共计算机上)。然后IE(至少6&7)抱怨XHTML并只提供文件下载。

我在w3c网站上阅读了如何使用XSL转换(http://www.w3.org/MarkUp/2004/xhtml-faq#ie)解决此问题。当我将其放置在适当的位置时,我发现Chrome现在大声抱怨未定义的实体(具体实体是,&nbsp;但是测试表明那是不相关的)。

奇怪的是,我可以通过在DOCTYPE中手动声明实体来解决这个问题:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd" [
<!ENTITY nbsp "&#160;">
]>

但我宁愿不要在整个实体范围内都这样做。我之所以说“ bizarrely”,是因为据我所知XHTML + MathML + SVG dtd确实声明了这些实体。因此,以某种方式错过了这些。

有办法解决这个问题吗?我可以向IE提供带有实体的XHTML吗?

如果很重要,这些页面是由php脚本生成的,并通过apache提供服务,因此,如果有一种可靠的方法来嗅探浏览器并修改文档的开头(因此仅将<?xml-stylesheet ...>位发送到IE),那将是可接受的替代方案。

(我希望我拥有正确的SE网站...如果我在错误的位置,请告诉我。带有标签的同上。)


纯粹的(X)HTML / CSS问题属于stackoverflow.com,但您的问题并不那么直接,因为您提到了可能的服务器端解决方案,因此我不会将其标记为可移动。如果您在这里没有得到任何答案,那么我将其删除并放在上面。一些HTML问题往往会在几秒钟内得到解答!
paulmorriss 2011年

@paulmoriss:感谢(部分!)澄清。有时,在东南部站点的泥泞中,我有点迷路了……
Andrew Stacey

重新阅读我的评论,我可能不太清楚。我的意思是“如果我是你,我将其删除...”。由你决定。
paulmorriss 2011年

@paulmoriss:这服务器端的配置问题,因为它与应付无法处理XHTML的浏览器以及如何向其发送可以应付的内容有关。扫描“相关”问题列表,似乎在思路上有很多相似之处。但是我不知道这个网站的范围是什么(阅读的越多,我就越困惑),而且我没有任何答案,所以我会在一段时间内听取您的建议。
安德鲁·斯泰西

Answers:


1

[i]如果有一种可靠的方法,可以嗅探浏览器并修改文档的开头(因此仅将位发送到IE),那么这将是一个可以接受的选择。

该PHP语句将与用户代理字符串中包含“ MSIE”的所有浏览器匹配,并且您可以根据需要通过添加版本号来优化条件:

$flag_is_ie = (false !== strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE'));

...带有版本号:

$flag_is_ie = (false !== strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.'));
$flag_is_ie = ( $flag_is_ie || (false !== strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.')));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.