10

アクティブなJSF(またはPrimefaces)ユーザーである誰かが、デフォルトでこれが発生する理由を説明できますか?誰もそれについて何もしていないのはなぜですか?

<p:commandLink id="baz" update=":foo:boop" value="Example" />

これは、ハックなしではJavaScriptまたはCSSで使用できないマークアップを生成し、通常は無効と見なされます。

<a href="javascript:void(0);" id=":foo:bar:baz">Example</a>

ここのid=":bar:baz:foo"属性にはコロンが含まれていますが、少なくともCSSの観点からは、この属性の有効な文字ではありません。

属性は仕様に従って有効である可能性がありますが、実際のJavaScriptおよびCSS実装では機能しません。

idつまり、 JSFでのデフォルトの属性生成は、フロントエンド開発には使用できません。

4

1 に答える 1

32

これが選択されたのは、エンドユーザーがJSFコンポーネントID(検証済み)で誤って使用しないこと、およびをエスケープすることでCSSセレクターで使用:できることを保証できる唯一の適切な区切り文字であるためです。\

HTML4仕様では、コロンは属性の有効な値であるidと規定されていることに注意してください。nameしたがって、「Web標準」と互換性がないというあなたの不満はどこにも行きません。

IDトークンとNAMEトークンは、文字([A-Za-z])で始まる必要があり、その後に任意の数の文字、数字([0-9])、ハイフン( "-")、アンダースコア( "_")を続けることができます。 、コロン( ":")、およびピリオド( "。")。

したがって、唯一の問題は、:エスケープする必要があるCSSセレクターの特殊文字であるということです。JS自体には、コロンに関する問題はありません。作品はdocument.getElementById("foo:bar")完全にうまくいきます。考えられる唯一の問題は、CSSセレクター構文を使用するjQueryにあります。

本当に必要な場合は、コンテキストパラメータをegまたは以下のように:設定することで、デフォルトの区切り文字をいつでも変更できます。JSFコンポーネントIDのどこにもその文字を使用しないことを保証する必要があるだけです(検証されていません!)。javax.faces.SEPARATOR_CHAR-_

<context-param>
    <param-name>javax.faces.SEPARATOR_CHAR</param-name>
    <param-value>-</param-value>
</context-param>

ちなみに、の_ようなJSF自動生成IDで発生するという追加の欠点があるため、JSFページ全体のすべてのコンポーネントが自動生成IDではなく固定IDを持っているj_id1ことも確認する必要があります。そうしないと、JSFはコンテナの子の命名を見つけるのに問題が発生します。 NamingContainer

私はそれをお勧めしません。それは長期的に混乱し、もろいです。もう一度考えてみると、平均的なJSF Webアプリの固有の要素は、通常、それ自体ではフォームやテーブルの内部にはありません。これらは通常、主なレイアウトの側面を表しています。そうでなければ、一般的なHTML/CSSの観点からは悪いデザインだと思います。IDの代わりに再利用可能なCSSクラス名でそれらを選択するだけです。本当に必要な場合は、いつでもプレーンHTMLでラップする<div><span>、JSFによってIDが付加されないようにすることができます。

参照:

于 2012-05-23T19:44:49.583 に答える