1. ホーム
  2. javascript

[解決済み] エンティティ名は,エンティティ参照の'&'の直後に付けなければならない。

2022-01-25 14:55:33

質問事項

パックマンゲームを*.xhtmlのページに載せたいのですが、どうしたらいいですか(jsf 2とprimefaces 3.5を使っています)

しかし

xhtmlでhtmlページを翻訳すると、このスクリプトでエラーになります。

    <script>

    var el = document.getElementById("pacman");

    if (Modernizr.canvas && Modernizr.localstorage && 
        Modernizr.audio && (Modernizr.audio.ogg || Modernizr.audio.mp3)) {
      window.setTimeout(function () { PACMAN.init(el, "./"); }, 0);
    } else { 
      el.innerHTML = "Sorry, needs a decent browser<br /><small>" + 
        "(firefox 3.6+, Chrome 4+, Opera 10+ and Safari 4+)</small>";
    }
  </script>

行で

if (Modernizr.canvas && Modernizr.localstorage && 

を得る。

エンティティ名は、エンティティ内の '&' の直後に記述する必要があります。 を参照してください。

この問題を解決する方法はありますか?

どのように解決するのですか?

これまで掲載されたすべての回答は正しい解決策を示していますが、具体的な問題の根本的な原因を適切に説明できている回答はありません。

FaceletsはXMLベースのビュー技術で、XHTML+XMLを使用してHTML出力を生成します。XMLには5つの特殊文字があり、XMLパーサーはこれらの文字を特別に扱います。

  • < タグの開始点です。
  • > タグの終端を表します。
  • " 属性値の開始と終了。
  • ' 属性値の代替的な開始と終了。
  • & で終わる)エンティティの開始点。 ; ).

の場合 & が続いていない場合 # (例 &#160; , &#xA0; など)、XMLパーサーは暗黙のうちに5種類の 定義済みエンティティ名 lt , gt , amp , quotapos または任意の 手動で定義したエンティティ名 . しかし、あなたの場合は & をXMLエンティティとしてではなく、JavaScriptの演算子として使用します。これによって、XMLのパース・エラーが発生したことが完全に説明できます。

エンティティ名の直後には、エンティティ参照の '&' を記述する必要があります。

要するに、あなたはJavaScriptのコードを間違った場所、JSファイルではなくXMLドキュメントに書いているわけですから、それに応じてすべてのXML特殊文字をエスケープする必要があります。そのため & としてエスケープする必要があります。 &amp; .

つまり、あなたの特定のケースでは

if (Modernizr.canvas && Modernizr.localstorage && 

になる必要があります。

if (Modernizr.canvas &amp;&amp; Modernizr.localstorage &amp;&amp;

でXML-validになります。

しかし、これではJavaScriptのコードが読みづらく、メンテナンスもしづらくなってしまいます。また & の代わりに &amp; をXML文書内のJavaScriptコードで使用する場合は、文字データ(CDATA)ブロックにJavaScriptコードを配置する必要があります。したがって、JSFの用語では、それは次のようになります。

<h:outputScript>
    <![CDATA[
        // ...
    ]]>
</h:outputScript>

XMLパーサーは、ブロックの内容をXMLとしてではなく、文字データとして解釈するため、XMLの特殊文字をそのまま解釈してしまいます。

しかし、より良い方法は、JSコードを独自のJSファイルに入れ、それを <script src> JSFの用語では <h:outputScript> .

<h:outputScript name="onload.js" target="body" />

(注 target="body" このようにすると、JSF は自動的に <script> の一番最後にある <body> に関係なく <h:outputScript> と同じ効果が得られます。 window.onload$(document).ready() ということで、このスクリプトではもうこれらを使う必要はありません)

こうすることで、JSのコードにXML特有の文字が含まれることを気にする必要がなくなります。さらに、ブラウザにJSファイルをキャッシュさせることができるので、レスポンスの総サイズを小さくすることができます。

こちらもご覧ください。