いくつかのテンプレートシステムはJavaScriptであります。しかし、私の個人的な好みは、XMLテンプレートをフェッチするためにajaxを使って自分自身で開発したものです。
<title>This is optional</title>
<body><![CDATA[
HTML content goes here, the CDATA block prevents XML errors
when using non-xhtml html.
<div id="more">
$CONTENT$ may be substituted using replace() before being
inserted into $DOCUMENT$.
</div>
]]></body>
<script><![CDATA[
/* javascript code to be evaled after template
* is inserted into document. This is to get around
* the fact that this templating system does not
* have its own turing complete programming language.
* Here's an example use:
*/
if ($HIDE_MORE$) {
document.getElementById('more').display = 'none';
}
]]></script>
、テンプレートを処理するJavaScriptコードはこのような何か行く:道へ
function insertTemplate (url_to_template, insertion_point, substitutions) {
// Ajax call depends on the library you're using, this is my own style:
ajax(url_to_template, function (request) {
var xml = request.responseXML;
var title = xml.getElementsByTagName('title');
if (title) {
insertion_point.innerHTML += substitute_strings(title[0],substitutions);
}
var body = xml.getElementsByTagName('body');
if (body) {
insertion_point.innerHTML += substitute_strings(body[0],substitutions);
}
var script = xml.getElementsByTagName('script');
if (script) {
eval(substitute_strings(script[0],substitutions));
}
});
}
function substitute_strings (str, substitutions) {
for (var n in substitutions) {
str.replace(n,substitutions[n]);
}
return str;
}
をテンプレートには、きれいにHTMLを埋め込むことが容易になり、それは次のようになりますXMLファイルですテンプレートを呼び出すと、次のようになります。
insertTemplate('http://path.to.my.template', myDiv, {
'$CONTENT$' : "The template's content",
'$DOCUMENT$' : "the document",
'$HIDE_MORE$' : 0
});
置換文字列の$
記号は、あなたがの%
を使用することができ、単なる慣習です#
または任意の区切り文字を使用してください。置換される部分をあいまいにすることはちょうどそこにあります。
テンプレートのサーバー側の処理ではなく、JavaScript側で置換を使用する大きな利点の1つは、テンプレートをプレーンな静的ファイルにすることができることです。サーバー側のコードを記述しなくて済むことを除けば、テンプレートのキャッシュポリシーを非常に積極的に設定できるため、ブラウザで最初に読み込んだときにブラウザでテンプレートを取得するだけで済みます。その後のテンプレートの使用はキャッシュから来て、非常に高速になります。
また、これはメカニズムを説明するための実装の非常に簡単な例です。私が使っているものではありません。これをさらに修正して、複数の置換、スクリプトブロックの処理の改善、返された最初の要素を使うだけでなく、forループを使用して複数のコンテンツブロックを処理したり、HTMLエンティティを適切に処理したりすることができます。
このように、HTMLはプレーンテキストファイルのHTMLだけです。これにより、HTML文字列をjavascriptに直接埋め込むと、通常は見つかる恐れのあるひどい文字列連結パフォーマンスの問題が回避されます。
テンプレートごとにXHRを実行するには時間がかかりますか?それとも他の提案を回避する方法がありますか? – Tower
テンプレートが膨大で、サーバーが極端に遅くならない限り、時間は無視してください(500ms〜2秒が標準であるはずです)。テンプレートを取得した後は、必要なときに使用できるように、テンプレートをjavascript変数に格納するだけです。 –
@rファクタ:この問題を回避する方法については私の答えを見てください。 – slebetman