我使用的是JSF2, GlassFish 3.1, PrimeFaces 2.x。
我在IE9上有奇怪的渲染问题。我应该能够通过插入以下内容来强制IE9渲染为IE9:
<html>
<head>
<!-- Enable IE9 Standards mode -->
<meta http-equiv="X-UA-Compatible" content="IE=9" />
...
但问题是,它不起作用,因为(我被告知)元标签必须是section中的第一个标签。
当我在XHTML文件中这样做时…
<html ...>
<f:view contentType="text/html" locale="#{loginHandler.currentLocale}">
<h:head>
<!-- Enable IE9 Standards mode -->
<meta http-equiv="X-UA-Compatible" content="IE=9" />
生成的HTML看起来是这样的,其中JSF/PrimeFaces在我的新元标记之前插入了一堆"link"one_answers"script"标签。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link type="text/css" rel="stylesheet" href="/orcf-webui/javax.faces.resource/jquery/ui/jquery-ui.css.jsf?ln=primefaces&v=2.2" />
<link type="text/css" rel="stylesheet" href="/orcf-webui/javax.faces.resource/wijmo/wijmo.css.jsf?ln=primefaces&v=2.2" />
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/jquery.js.jsf?ln=primefaces&v=2.2"></script>
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/ui/jquery-ui.js.jsf?ln=primefaces&v=2.2"></script>
<!-- Enable IE9 Standards mode -->
<meta http-equiv="X-UA-Compatible" content="IE=9" />
有什么办法让我的元标签在正确的地方,所以它将工作?(或者另一种解决IE9问题的方法?
-
meta标签必须在所有PrimeFaces内容之前放置:http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx
-
HTTP Header和HTML HEAD是完全不同的东西
-
在PrimeFaces 3.0中,新的facet被添加到
h:head
:http://blog.primefaces.org/?p=1433所以解决方案是:
<h:head>
<f:facet name="first">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
</f:facet>
</h:head>
我认为最好的解决方案是创建JSF PhaseListener,它将x - ua兼容头添加到HTTP响应
public class UACompatibleHeaderPhaseListener implements PhaseListener {
private static final long serialVersionUID = 1L;
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
@Override
public void beforePhase(PhaseEvent event) {
final FacesContext facesContext = event.getFacesContext();
final HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
response.addHeader("X-UA-Compatible", "IE=edge");
}
@Override
public void afterPhase(PhaseEvent event) {
}
}
并注册到faces-config.xml
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" version="2.0">
<lifecycle>
<phase-listener>com.example.UACompatibleHeaderPhaseListener</phase-listener>
</lifecycle>
</faces-config>
另一个选择是创建servlet过滤器并将其注册到web.xml中。
为什么需要这个?
假设您的web应用程序部署在IE兼容性列表中的域(或子域):http://ie9cvlist.ie.microsoft.com/ie9CompatViewList.xml,因此您需要使用X-UA-Compatible标头将IE切换回最新模式
假设您的web应用程序部署在WebLogic服务器上(使用mojarra 2.0.4),因此您无法更改JSF实现。
银鲈
您可以创建Filter
添加标题:
X-UA-Compatible: IE=9
响应对象。
源只是想评论一下你的回答和之前的评论:
如果你在IE8上查看页面,如图所示,HTTP头和HTML头并不是完全不同的东西(有效地)。如果你设置了HTTP头,而不是HTML头,来自HTTP头的指令仍然会被考虑。
我不知道IE9的行为,但我猜是以类似的方式。
你可能想从Mojarra切换到MyFaces。看看MyFaces的HEAD渲染器的源代码——首先渲染元素的内容,然后是其他资源。Mojarra的做法可能与此相反。如果您不想切换JSF实现,您可以实现您自己的HEAD元素呈现器。
然而,我建议只是找出为什么IE9没有 x - ua兼容元标签不能工作。它应该使新版本的行为像旧版本。