如何使元标记成为<head>该部分中的第一个元标记?



我使用的是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&amp;v=2.2" />
<link type="text/css" rel="stylesheet" href="/orcf-webui/javax.faces.resource/wijmo/wijmo.css.jsf?ln=primefaces&amp;v=2.2" />
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/jquery.js.jsf?ln=primefaces&amp;v=2.2"></script>
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/ui/jquery-ui.js.jsf?ln=primefaces&amp;v=2.2"></script>
<!-- Enable IE9 Standards mode -->
<meta http-equiv="X-UA-Compatible" content="IE=9" />

有什么办法让我的元标签在正确的地方,所以它将工作?(或者另一种解决IE9问题的方法?

  1. meta标签必须在所有PrimeFaces内容之前放置:http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx

  2. HTTP Header和HTML HEAD是完全不同的东西

  3. 在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中。

为什么需要这个?

  1. 假设您的web应用程序部署在IE兼容性列表中的域(或子域):http://ie9cvlist.ie.microsoft.com/ie9CompatViewList.xml,因此您需要使用X-UA-Compatible标头将IE切换回最新模式

  2. 假设您的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兼容元标签不能工作。它应该使新版本的行为像旧版本。

相关内容

  • 没有找到相关文章

最新更新