Как сделать метатег первым в разделе <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" />
...
Но дело в том, что это не работает, потому что (как мне сказали) метатег ДОЛЖЕН быть первым тегом в разделе.
Когда я делаю это в моем файле 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&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?
5 ответов
Метатег должен идти перед всеми вещами PrimeFaces: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx
Заголовок HTTP и заголовок HTML - это совершенно разные вещи.
В 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>
Я думаю, что лучшим решением является создание 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) {
}
}
и зарегистрируйте его в 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.
Зачем это нужно?
Представьте, что ваше веб-приложение развернуто в домене (или субдомене), который находится в списке совместимости IE, здесь: http://ie9cvlist.ie.microsoft.com/ie9CompatViewList.xml поэтому вам нужно использовать заголовок X-UA-Compatible для переключить IE обратно в последний режим.
Представьте, что ваше веб-приложение развернуто на сервере WebLogic (который использует mojarra 2.0.4), поэтому вы не можете изменить реализацию JSF.
Просто прокомментируйте ваш ответ и предыдущие комментарии:
Заголовок HTTP и заголовок HTML не совсем разные вещи (эффективно), если вы просматриваете страницу в IE8, как показано на схеме ниже. Если вы установили заголовок HTTP, но не заголовок HTML, директива из заголовка HTTP все равно будет принята во внимание.
Я не знаю, как ведет себя IE9, но я думаю, что аналогичным образом.
Вы можете создать Filter
который добавляет заголовок:
X-UA-Compatible: IE=9
к объекту ответа.
Возможно, вы захотите перейти с Мохарры на MyFaces. Глядя на исходный код рендерера HEAD MyFaces - сначала визуализируется содержимое элемента, а затем другие ресурсы. Мохарра делает это, вероятно, наоборот. Если вы не хотите переключать реализации JSF, вы можете просто реализовать свой собственный рендерер элементов HEAD.
Однако я бы предложил просто выяснить, почему IE9 не работает без метатега X-UA-Compatible. Предполагается, что новые версии будут вести себя как старые версии.