如何将元标记作为<head>部分中的第一个?

Rob*_*ume 20 jsf primefaces internet-explorer-9

我正在使用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" />
...
Run Code Online (Sandbox Code Playgroud)

但事实是,它不起作用,因为(我被告知)元标记必须是该部分中的第一个标记.

当我在我的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" />
Run Code Online (Sandbox Code Playgroud)

生成的HTML看起来像这样,其中JSF/PrimeFaces在我的新元标记之前插入了一堆"链接"和"脚本"标记.

<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" />
Run Code Online (Sandbox Code Playgroud)

有没有办法让我的元标记在正确的位置,以便它可以工作?(或者让IE9问题消失的另一种方法是什么?

Dan*_*lor 27

  1. 元标记必须所有PrimeFaces 之前:http: //blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web- applications.aspx

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

  3. 在PrimeFaces 3.0中,新的方面被添加到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>
Run Code Online (Sandbox Code Playgroud)


Voj*_*jta 14

我认为最好的解决方案是创建JSF PhaseListener,它将X-UA-Compatible标头添加到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) {
    }

}
Run Code Online (Sandbox Code Playgroud)

并在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>
Run Code Online (Sandbox Code Playgroud)

另一种选择是创建servlet Filter并在web.xml中注册它.

为什么需要这个?

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

  2. 想象一下,您的Web应用程序部署在WebLogic服务器上(使用mojarra 2.0.4),因此您无法更改JSF实现.


Pav*_*ral 1

您可能想从 Mojarra 切换到 MyFaces。查看MyFaces 的 HEAD 渲染器的源代码- 首先渲染元素的内容,然后渲染其他资源。Mojarra 可能正在以相反的方式做这件事。如果您不想切换 JSF 实现,您可以只实现您自己的 HEAD 元素渲染器。

不过,我建议只是找出为什么 IE9 在没有X-UA-Compatible元标记的情况下无法工作。它应该使新版本的行为像旧版本一样。