这是我在Eclipse中的源代码文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
</body>
</html>
当我在IE9中查看它时,它呈现文本:
<!--[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]-->
如果我查看源代码,它显示:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
</body>
</html>
有什么原因可以解释为什么在Faces Servlet服务后源代码发生了变化?
已知问题,JSF呈现会转义注释。您可以通过使用<h:outputText escape="false">
和HTML实体来解决这个问题。您还可以使用OmniFaces <o:conditionalComment>
以更好的方式解决它。另见展示站点:
<o:conditionalComment>
呈现条件注释。条件注释是IE特有的功能,它允许开发人员根据客户端是否使用IE,甚至是哪个版本来(out)注释HTML块。它们通常与CSS样式表结合使用,如下所示:<!--[if lte IE 7]> <link rel="stylesheet" href="ie6-ie7.css" /> <![endif]-->
但是,Facelets将注释的内容转义为html,这使得它无法使用。
<!--[if lte IE 7]> <link rel="stylesheet" href="ie6-ie7.css" /> <![endif]-->
同样,如果
javax.faces.FACELETS_SKIP_COMMENTS
上下文参数被设置为true
,那么它甚至不会被渲染。你需要用一个难看的<h:outputText escape="false">
来解决这个问题。<h:outputText value="<!--[if lte IE 7]><link rel="stylesheet" href="ie6-ie7.css" /><![endif]-->" escape="false" />
这个组件是用来解决这个问题的。
<o:conditionalComment if="lte IE 7"> <link rel="stylesheet" href="ie6-ie7.css" /> </o:conditionalComment>
注意,你不能对
<h:outputStylesheet>
使用这个,因为它会隐式地重新定位为<h:head>
的直接子节点。
这行得通:
<h:outputText escape="false" value="<!--[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]-->"></h:outputText>
我逐字使用了f:,这样更简洁。
例如
<f:verbatim>
<!--[if gte IE 8]>
<script type="text/javascript">
//<![CDATA[
/** Javascript **/
//]]>
</script>
<![endif]-->
</f:verbatim>
JSF核心标签参考
注意:这个标签自JSF 2.0(2009年12月)起已弃用。它只适用于JSP