エンティティ名は、エンティティ参照の「&」の直後に続く必要があります


91

* .xhtmlページにパックマンゲームを配置したい(jsf2とprimefaces3.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 && 

私は得る:

エンティティ名は、エンティティ参照の「&」の直後に続く必要があります。

それを修正する方法はありますか?

回答:


219

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

Faceletsは、XHTML + XMLを使用してHTML出力を生成するXMLベースのビューテクノロジです。XMLには、XMLパーサーによって特別に扱われる5つの特殊文字があります。

  • < タグの始まり。
  • > タグの終わり。
  • " 属性値の開始と終了。
  • ' 属性値の代替の開始と終了。
  • &エンティティの開始(で終わる;)。

以下の場合に&続いされていない#(例えば&#160;&#xA0;など)、XMLパーサーは、暗黙のうちに5人の1を探している定義済みのエンティティ名 ltgtampquotおよびapos、または任意の手動で定義されたエンティティ名。ただし、特定のケースでは&、XMLエンティティとしてではなく、JavaScript演算子として使用していました。これは、発生したXML解析エラーを完全に説明しています。

エンティティ名は、エンティティ参照の「&」の直後に続く必要があります

本質的に、JavaScriptコードを間違った場所、つまりJSファイルではなくXMLドキュメントに記述しているため、それに応じてすべてのXML特殊文字をエスケープする必要があります。&以下のようにエスケープする必要があります&amp;

だから、あなたの特定のケースでは、

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

になる必要があります

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

XMLで有効にします。

ただし、これにより、JavaScriptコードの読み取りと保守が困難になります。Mozilla Developer Networkの優れたドキュメント「XHTML用のJavaScriptの記述」で述べられているように、JavaScriptコードを文字データ(CDATA)ブロックに配置する必要があります。したがって、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ファイルをキャッシュさせて、合計応答サイズを小さくすることができます。

参照:


![CDATA [はコメント行にすべきではありませんか?ちょっと興味があるんだけど。
nacho321 2013

@ Nacho321:コンテンツタイプが誤ってではなくに設定されている場合のみ。これapplication/xhtml+xmlによりtext/html、一部のブラウザ、主にMSIEでいくつかの障害が発生します。「XHTML用のJavaScriptの記述」ドキュメントも参照してください。JSFでは、<f:view contentType="text/html">JSF / webbrowserの自動推測に作業を任せる代わりに、を使用する場合は必要ありません。さらに、stackoverflow.com
tags / xhtml / info

注:これは、Javascipt操作(&amp;&amp;エラーの1行上のifステートメントで正しく使用しているため)だけでなく、コメント行でも発生します。エラーが発生していました// TODO KevinC & Victor: some todo(現在はand..に変更されています)。また、この投稿に感謝します。OPと同じ問題の修正として以前に遭遇しました。
Kevin Cruijssen 2016

あなたの答えは間違っています。&amp;である必要があります &amp;&amp;の代わりに
ファンキー-2017

1
@ funky-nd:&amp; amp;と混同していると思います。これを念頭に置いて答えを読み直してください。
BalusC 2017

14

すべてのXHTML文字を手動で調べてエスケープする場合を除いて、スクリプトタグ内にCDATAタグを追加する必要があります(たとえば、に&なる必要があります&amp;)。例えば:

<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>

12

パーサーはいくつかのHTMLコンテンツを期待しているため&、のようにエンティティの始まりと見なされ&egrave;ます。

この回避策を使用してください:

<script type="text/javascript">
// <![CDATA[
Javascript code here
// ]]>
</script>

したがって、コードがHTMLテキストではなく、そのまま使用されるデータであることを指定します。



2

XHTMLを使用する場合は、何らかの理由で、XHTML 1.0 C 4に「スクリプトで<または&または]]>または-を使用する場合は外部スクリプトを使用する」と記載されていることに注意してください。つまり、スクリプトコードをscript要素内に埋め込まずに、別のJavaScriptファイルに入れて、で参照します<script src="foo.js"></script>


0

Bloggerの誰かが到着した場合に備えてBeautify、VSCodeで拡張機能を使用しているときにこの問題が発生しました。それを使用しないbeautifyでください、それをしないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.