* .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は、XHTML + XMLを使用してHTML出力を生成するXMLベースのビューテクノロジーです。 XMLには、XMLパーサーによる特別な処理を持つ5つの特殊文字があります。
<
タグの開始。>
タグの終わり。"
属性値の開始と終了。'
属性値の代替の開始と終了。&
エンティティの開始(;
で終了)。&
の後に#
が続かない(たとえば 
、 
など)場合、XMLパーサーは暗黙的に5つの 事前定義されたエンティティ名lt
、gt
、amp
、quot
、およびapos
または任意の 手動で定義されたエンティティ名 。ただし、特定のケースでは、XMLエンティティとしてではなくJavaScript演算子として&
を使用していました。これは、取得したXML解析エラーを完全に説明しています。
エンティティ名は、エンティティ参照の「&」の直後になければなりません
本質的に、JavaScriptコードを間違った場所、つまりJSファイルではなくXMLドキュメントで記述しているため、それに応じてすべてのXML特殊文字をエスケープする必要があります。 &
は&
としてエスケープする必要があります。
だから、あなたの特定のケースでは、
if (Modernizr.canvas && Modernizr.localstorage &&
なる必要があります
if (Modernizr.canvas && Modernizr.localstorage &&
xMLを有効にします。
ただし、これによりJavaScriptコードの読み取りと保守が難しくなります。 Mozilla Developer Networkの優れたドキュメント XHTML用JavaScriptの記述 で述べられているように、JavaScriptデータを文字データ(CDATA)ブロックに配置する必要があります。したがって、JSFの用語では、次のようになります。
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
XMLパーサーは、ブロックのコンテンツをXMLではなく「プレーンバニラ」文字データとして解釈するため、XML特殊文字を「そのまま」解釈します。
ただし、<script src>
によってインクルードする独自のJSファイル、またはJSFの用語である<h:outputScript>
にJSコードを置く方がはるかに良いです。
<h:outputScript name="onload.js" target="body" />
(target="body"
に注意してください;このようにJSFは<script>
自体の位置に関係なく、<body>
の最後に<h:outputScript>
を自動的にレンダリングします。これにより、window.onload
および$(document).ready()
と同じ効果が得られます。そのスクリプトでこれらを使用する必要はありません)
これにより、JSコードでXMLの特殊文字を心配する必要がなくなります。追加のボーナスとして、これにより、合計応答サイズが小さくなるようにブラウザーでJSファイルをキャッシュできるようになります。
スクリプトタグ内にCDATAタグを追加する必要があります。ただし、手動ですべてのXHTML文字を処理してエスケープする場合を除きます(たとえば、&
は&
になる必要があります)。例えば:
<script>
//<![CDATA[
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>
パーサーはいくつかのHTMLコンテンツを想定しているため、&
のように、è
をエンティティの始まりとして認識します。
この回避策を使用します。
<script type="text/javascript">
// <![CDATA[
Javascript code here
// ]]>
</script>
そのため、コードはHTMLテキストではなく、そのまま使用するデータであることを指定します。
行う
<script>//<![CDATA[
/* script */
//]]></script>
XHTMLを使用する場合は、何らかの理由で、 XHTML 1.0 C 4 が「スクリプトで<または&または]]>または-を使用する場合は外部スクリプトを使用する」ことに注意してください。スクリプト変数をscript
要素内に埋め込みますが、それを別のJavaScriptファイルに入れ、<script src="foo.js"></script>
で参照します。