web-dev-qa-db-ja.com

<head>セクションの最初のメタタグを作成するにはどうすればよいですか?

JSF2、GlassFish 3.1、PrimeFaces2.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が新しいメタタグの前に一連の「リンク」タグと「スクリプト」タグを挿入しました。

<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の問題を解決する別の方法はありますか?

20
user550738
  1. メタタグはbeforeすべての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= 14 したがって、解決策は次のようになります。

<h:head>
    <f:facet name="first">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge, chrome=1" />
    </f:facet>
</h:head>
27
Danubian Sailor

最善の解決策は、HTTP応答にX-UA-Compatibleヘッダーを追加するJSFPhaseListenerを作成することだと思います

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>

もう1つのオプションは、サーブレットFilterを作成し、それをweb.xmlに登録することです。

なぜこれが必要なのですか?

  1. WebアプリケーションがIE互換性リストはこちら: http://ie9cvlist.ie.Microsoft.com/ie9CompatViewList)にあるドメイン(またはサブドメイン)にデプロイされていると想像してください。 xml したがって、X-UA-Compatibleヘッダーを使用して、IEを最新モードに戻す必要があります。

  2. WebアプリケーションがWebLogicサーバー(mojarra 2.0.4を使用)にデプロイされているため、JSFの実装を変更できないと想像してください。

クロサギ

14
Vojta

Filter を作成して、ヘッダーを追加できます。

X-UA-Compatible: IE=9

応答オブジェクトへ。

ソース

3

MojarraからMyFacesに切り替えることをお勧めします。 MyFaces 'HEADレンダラー -のソースコードを見ると、最初に要素のコンテンツがレンダリングされ、次に他のリソースがレンダリングされます。Mojarraはおそらく逆の方法でこれを行っています。 JSF実装を切り替えたくない場合は、独自のHEAD要素レンダラーを実装するだけです。

ただし、IE9がX-UA-Compatibleメタタグなしでは機能しない理由を調べることをお勧めします。新しいバージョンを古いバージョンのように動作させることになっています。

2
Pavel Horal

あなたの答えと以前のコメントにコメントするだけです:

図はこちら で示されているように、IE8でページを表示した場合、HTTPヘッダーとHTMLヘッドは(事実上)完全に異なるものではありません。 HTMLヘッドではなくHTTPヘッダーを設定した場合でも、HTTPヘッダーからのディレクティブは考慮されます。

IE9がどのように動作するかはわかりませんが、同じように推測します。

2
Kangur