Как сделать метатег первым в разделе <head>? - PullRequest
20 голосов
/ 28 июля 2011

Я использую 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" />
...

Но дело в том, что он не работает, потому что (как мне сказали) метатег ДОЛЖЕН быть первым тегом в разделе.

Когда я делаю это в моем файле 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" и "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?

Ответы [ 5 ]

27 голосов
/ 03 декабря 2012
  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 - это совершенно разные вещи.

  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>
14 голосов
/ 12 ноября 2011

Я думаю, что лучшим решением является создание 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) {
    }

}

и регистрирует его в face-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>

Другой вариант - создать Фильтр сервлета и зарегистрировать его в web.xml.

Зачем это нужно?

  1. Представьте, что ваше веб-приложение развернуто в домене (илисубдомен), который находится в списке совместимости IE здесь: http://ie9cvlist.ie.microsoft.com/ie9CompatViewList.xml, поэтому вам нужно использовать заголовок, совместимый с X-UA, для переключения IE обратно в последний режим.

  2. Представьте себеВаше веб-приложение развернуто на сервере WebLogic (который использует mojarra 2.0.4), поэтому вы не можете изменить реализацию JSF.

3 голосов
/ 07 октября 2011

Вы можете создать Filter, который добавляет заголовок:

X-UA-Compatible: IE=9

к объекту ответа.

Источник

2 голосов
/ 04 декабря 2012

Просто прокомментируйте ваш ответ и предыдущие комментарии:

Заголовок HTTP и заголовок HTML не являются абсолютно разными вещами (эффективно), если вы просматриваете страницу в IE8, как показано на диаграмме здесь . Если вы установили заголовок HTTP, но не заголовок HTML, директива из заголовка HTTP все равно будет учтена.

Я не знаю, как ведет себя IE9, но я думаю, что похожим образом.

2 голосов
/ 28 июля 2011

Возможно, вы захотите перейти с Мохарры на MyFaces.Глядя на исходный код HEAD-рендеринга MyFaces - сначала рендерится содержимое элемента, а затем другие ресурсы.Мохарра делает это, вероятно, наоборот.Если вы не хотите переключать реализации JSF, вы можете просто реализовать свой собственный рендерер элементов HEAD.

Однако я бы посоветовал просто узнать, почему IE9 не работает без X-UA-Compatible метатег.Предполагается, что новые версии будут вести себя как старые версии.

...