How to make a meta tag the first one in the <head> section?

前端 未结 5 1485
感动是毒
感动是毒 2020-12-05 00:42

I\'m using JSF2, GlassFish 3.1, PrimeFaces 2.x.

I\'m having strange rendering problems on IE9. I\'m supposed to be able to force IE9 to render as IE9 by inserting

相关标签:
5条回答
  • 2020-12-05 01:19
    1. The meta tag must go before all PrimeFaces stuff: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx

    2. HTTP Header and HTML HEAD are completly different things.

    3. In PrimeFaces 3.0 the new facet was added to h:head: http://blog.primefaces.org/?p=1433 So the solution would be:

    <h:head>
        <f:facet name="first">
            <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
        </f:facet>
    </h:head>
    
    0 讨论(0)
  • 2020-12-05 01:19

    Just to comment on your answer and previous comments:

    HTTP Header and HTML Head are not completly different things (effectively) if you view page on IE8 as shown by diagram here. If you set HTTP header, but not HTML Head, the directive from HTTP header is still taken into account.

    I don't know how IE9 behaves, but I guess that in a similar way.

    0 讨论(0)
  • 2020-12-05 01:22

    I think best solution is to create JSF PhaseListener which adds X-UA-Compatible header to HTTP response

    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) {
        }
    
    }
    

    and register it in 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>
    

    Another option would be to create servlet Filter and register it in web.xml.

    Why is this needed?

    1. Imagine your web application is deployed on a domain (or sub-domain) which is on IE compatibility list here: http://ie9cvlist.ie.microsoft.com/ie9CompatViewList.xml so you need to use X-UA-Compatible header to switch IE back to latest mode.

    2. Imagine your web application is deployed on WebLogic server (which uses mojarra 2.0.4) so you cannot change JSF implementation.

    mojarra

    0 讨论(0)
  • 2020-12-05 01:24

    You might want to switch from Mojarra to MyFaces. Looking at the source code of MyFaces' HEAD renderer - first gets rendered the content of the element and then other resources. Mojarra is doing this probably other way around. If you don't want to switch JSF implementations you can just implement your own HEAD element renderer.

    However I would suggest just to find out why IE9 is not working without the X-UA-Compatible meta tag. It is supposed to make newer versions to behave like older versions.

    0 讨论(0)
  • 2020-12-05 01:33

    You can create Filter which adds header:

    X-UA-Compatible: IE=9
    

    to response object.

    Source

    0 讨论(0)
提交回复
热议问题