[解決済み】XHTMLのパースでエラー。要素の内容は整形された文字データまたはマークアップで構成されていなければならない
質問事項
この延長線上として
質問
にJavascriptを挿入しようとしています。
<h:commandButton />
's
onclick
プロパティを
action
はすでにajaxテーブルをレンダリングしています。
やりたいこと
リストボックスで選択されたアイテムを取得し、JSFで使用するためのパラメータに変換する。
FileServlet
...すなわち
para2=value1¶m=value2¶m=value3
こんな感じです。
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId('myForm:box');
var length = box.options.length;
var paramstring = "";
for (var i = 0; i < length; i++) {
if (i != (length - 1) {
if (box.options[i].selected) {
paramstring = paramstring + "param=" + box.options[i].value + "&";
}
} else {
paramstring = paramstring + "param=" + box.options[i].value;
}
}
if (document.getElementById('myForm:checkbox').checked) {
window.location='fileServlet? + paramstring;
}
}
</script>
ページが読み込まれたときに表示されるもの。
javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.
例外が発生しないもの
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId('myForm:box');
var length = box.options.length;
var paramstring = "";
if (document.getElementById('myForm:checkbox').checked) {
window.location='fileServlet? + paramstring;
}
}
</script>
を追加すると、すぐに
for (var i = 0; i < length; i++)
あるいは
for (var i = 0; i < 10; i++)
を実行すると、ページが読み込まれない。なぜ、forループが気に入らないのでしょうか?
解決方法は?
FaceletsはXMLベースのビュー技術で、XHTML+XMLを使用してHTML出力を生成します。XMLには5つの特殊文字があり、XMLパーサーはこれらの文字を特別に扱います。
-
<
タグの開始点です。 -
>
タグの終端を表します。 -
"
属性値の開始と終了。 -
'
属性値の代替的な開始と終了。 -
&
で終わる)エンティティの開始点。;
).
の場合
<
この場合、XMLパーサーは暗黙のうちにタグ名と終了タグを探します。
>
. しかし、あなたの特定のケースでは、あなたは
<
をXMLエンティティとしてではなく、JavaScriptの演算子として使用します。これによって、XMLのパース・エラーが発生したことが完全に説明できます。
要素の内容は、整形された文字データまたはマークアップで構成されていなければなりません。
要するに、あなたはJavaScriptのコードを間違った場所、JSファイルではなくXMLドキュメントに書いているのですから、それに応じてすべてのXML特殊文字をエスケープしなければなりません。その
<
としてエスケープする必要があります。
<
.
つまり、本来は
for (var i = 0; i < length; i++) {
になる必要があります。
for (var i = 0; i < length; i++) {
でXML-validになります。
しかし、これでは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="functions.js" target="head" />
こうすることで、JSのコードにXML特有の文字が含まれることを気にする必要がなくなります。さらに、ブラウザがJSファイルをキャッシュする機会を与えるので、平均的なレスポンス・サイズが小さくなるという利点もあります。
こちらもご覧ください。
関連
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】Uncaught SyntaxError: JSON の位置 0 に予期しないトークン u があります。
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み] テスト
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】エラー:リクエストのエンティティが大きすぎる
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?
-
[解決済み] エンティティ名は,エンティティ参照の'&'の直後に付けなければならない。