JavaScriptのテンプレートエンジンを作ってみる
■ このスレッドは過去ログ倉庫に格納されています
11
2019/03/05(火) 00:50:27.87ID:8a3k8XPA よ?
21
2019/03/06(水) 17:34:50.45ID:1pbO3u+T まずはライブラリの名前を決めた
31
2019/03/06(水) 23:20:38.72ID:1pbO3u+T サンプル(1)
<!doctype html>
<html lang="ja" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="../lib/biew.js"></script>
<script src="./test.js"></script>
</head>
<body biew:canvas="page" biew:id="body">
<section biew:id="section">
<h1 biew:id="heading1">この要素はHeading Element1です。</h1>
<h2>{{ heading2 }}</h2>
<h3 biew:id="heading3">薬草は<span>{{ heading3.gold }}</span>Gです。</h3>
</section>
</body>
<html>
<!doctype html>
<html lang="ja" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="../lib/biew.js"></script>
<script src="./test.js"></script>
</head>
<body biew:canvas="page" biew:id="body">
<section biew:id="section">
<h1 biew:id="heading1">この要素はHeading Element1です。</h1>
<h2>{{ heading2 }}</h2>
<h3 biew:id="heading3">薬草は<span>{{ heading3.gold }}</span>Gです。</h3>
</section>
</body>
<html>
41
2019/03/06(水) 23:22:11.81ID:1pbO3u+T サンプル(1)test.js
var page = new Biew.Canvas(); // <body biew:canvas="page">
page.draw = function(node){
page.body.setAttr("style", "background-color:#8888FF;"); // bg blue.
page.section.setAttr("style", "background-color:#CCCCCC; width:512px;"); // bg grey.
var h1 = page.heading1; // true === (h1 instanceof Biew.Element)
h1.setText("テンプレートエンジンのサンプル");
var h2 = page.heading2;
h2.setText("Hello World!");
h2.setAttr("style", "background-color:#FFFFFF;");
var h3 = page.heading3;
h3.setAttr("style", "color:white; background-color:black;"); // font white, bg black.
h3.gold.setText("8");
h3.gold.setAttr("style", "color:#66FF66;"); // font grean.
};
window.onload = function(){
Biew.init();
Biew.draw();
};
var page = new Biew.Canvas(); // <body biew:canvas="page">
page.draw = function(node){
page.body.setAttr("style", "background-color:#8888FF;"); // bg blue.
page.section.setAttr("style", "background-color:#CCCCCC; width:512px;"); // bg grey.
var h1 = page.heading1; // true === (h1 instanceof Biew.Element)
h1.setText("テンプレートエンジンのサンプル");
var h2 = page.heading2;
h2.setText("Hello World!");
h2.setAttr("style", "background-color:#FFFFFF;");
var h3 = page.heading3;
h3.setAttr("style", "color:white; background-color:black;"); // font white, bg black.
h3.gold.setText("8");
h3.gold.setAttr("style", "color:#66FF66;"); // font grean.
};
window.onload = function(){
Biew.init();
Biew.draw();
};
51
2019/03/06(水) 23:25:49.76ID:1pbO3u+T61
2019/03/08(金) 00:59:23.45ID:kMybevyH 上記のサンプルを解説
1.
属性(biew:canvas)が付加された要素内を一括に再描画する
要素のクローンがfunction draw(node)に引数として渡され、
DOM操作されたクローンがHTMLFragmentとして差し替えられる
2.
属性(biew:id)の値と同じ名前の変数に、対となるHTMLElementが代入される
<h2>の{{変数名}}はTextNodeの代入ではなく<h1>と同じように、
要素を変数に代入する糖衣構文である
<h3>では<h1>と<h2>の例を組み合わせて文字列と属性を変更した
1.
属性(biew:canvas)が付加された要素内を一括に再描画する
要素のクローンがfunction draw(node)に引数として渡され、
DOM操作されたクローンがHTMLFragmentとして差し替えられる
2.
属性(biew:id)の値と同じ名前の変数に、対となるHTMLElementが代入される
<h2>の{{変数名}}はTextNodeの代入ではなく<h1>と同じように、
要素を変数に代入する糖衣構文である
<h3>では<h1>と<h2>の例を組み合わせて文字列と属性を変更した
71
2019/03/16(土) 23:01:43.70ID:Jt4TMHpi Vue, Reactみたいな双方バインディングを作りたかったけど簡単には作れないや
2019/03/23(土) 08:25:09.46ID:xbtzdLRS
HTMLはやめてJSONなどJSで完結できるようにして
91
2019/03/25(月) 21:40:09.75ID:ci2yIkxV HTMLはやめるってHTML内にif else forとかの独自属性をごてごて埋め込むことかな?
id属性とか{{name}}でHTML内のタグの位置を特定するのだけは必要だと思う
そうじゃないとjQueryみたいにセレクタを使うことになるから
id属性とか{{name}}でHTML内のタグの位置を特定するのだけは必要だと思う
そうじゃないとjQueryみたいにセレクタを使うことになるから
101
2019/03/26(火) 23:37:48.08ID:NVFp1MPL 今日は試しにWebComponentsぽい機能を作ってみる
index.html(HTML)
https://pastebin.com/zgk87cxy
config.xml(XML/XHTML)
https://pastebin.com/KuBEp3vm
test.js(JavaScript)
https://pastebin.com/8bnMsLF0
↓出力HTML
https://pastebin.com/UUet5Rw1
https://i.imgur.com/hm4txLj.png
index.html(HTML)
https://pastebin.com/zgk87cxy
config.xml(XML/XHTML)
https://pastebin.com/KuBEp3vm
test.js(JavaScript)
https://pastebin.com/8bnMsLF0
↓出力HTML
https://pastebin.com/UUet5Rw1
https://i.imgur.com/hm4txLj.png
111
2019/03/27(水) 00:42:38.58ID:aVpY1CXQ ちょっと構想を書いてみる。
例えばログインのユーザー入力でエラーが生じたとき、よく赤字でエラーメッセージをだす。
そのときよくあるテンプレートエンジンではHTML内にifを埋め込んでいたりする。
// JS
var js = {
loginErrorName : true, // booleanがfalseのときはhtmlタグが消える
loginErrorPass : false
};
// HTML
<p id="loginError">
<div framework:if="js.loginErrorName" style="color:red;">※そのアカウント名は存在しません。</div>
<div framework:if="js.loginErrorPass" style="color:red;">※パスワードが間違っています</div>
</p>
↓上記を下記のようにクラスライブラリ化してみるか?
// JS
var loginError = new LoginError();
loginError.loginErrorName = true;
loginError.loginErrorPass = false;
// HTML
<p>{{ loginError }}</p>
これだとタグライブラリを作るのに近い感じになりそう。
例えばログインのユーザー入力でエラーが生じたとき、よく赤字でエラーメッセージをだす。
そのときよくあるテンプレートエンジンではHTML内にifを埋め込んでいたりする。
// JS
var js = {
loginErrorName : true, // booleanがfalseのときはhtmlタグが消える
loginErrorPass : false
};
// HTML
<p id="loginError">
<div framework:if="js.loginErrorName" style="color:red;">※そのアカウント名は存在しません。</div>
<div framework:if="js.loginErrorPass" style="color:red;">※パスワードが間違っています</div>
</p>
↓上記を下記のようにクラスライブラリ化してみるか?
// JS
var loginError = new LoginError();
loginError.loginErrorName = true;
loginError.loginErrorPass = false;
// HTML
<p>{{ loginError }}</p>
これだとタグライブラリを作るのに近い感じになりそう。
121
2019/03/31(日) 13:51:59.56ID:quVuOhjO 要素の繰り返しが鬼門だな
131
2019/04/03(水) 18:11:43.84ID:0NhWgLHB 考えた結果、作り直すことにした
Vueの単一ファイルコンポーネントみたいなのを作ろうかと構想してたけど
まずはもっと簡単にjQueryみたいなことをやってみるぞ
Vueの単一ファイルコンポーネントみたいなのを作ろうかと構想してたけど
まずはもっと簡単にjQueryみたいなことをやってみるぞ
2019/04/03(水) 19:10:41.45ID:/cw++oNj
jQueryのどこがテンプレートエンジンなんだ?
とっとと削除依頼出して回線切って首吊って死ねや
とっとと削除依頼出して回線切って首吊って死ねや
151
2019/04/04(木) 08:08:33.83ID:AP8fvSfz 結局DOM操作したほうがいいじゃんと思って。
html内に埋め込まないテンプレートエンジンてこうだろ?↓
特に工夫することもないよね
HTML
https://pastebin.com/8hS3FZur
JS
https://pastebin.com/W5znAzjg
↓出力結果
HTML
https://pastebin.com/1DXTjD88
html内に埋め込まないテンプレートエンジンてこうだろ?↓
特に工夫することもないよね
HTML
https://pastebin.com/8hS3FZur
JS
https://pastebin.com/W5znAzjg
↓出力結果
HTML
https://pastebin.com/1DXTjD88
16デフォルトの名無しさん
2019/04/06(土) 23:26:17.28ID:+du4Jk0c やはりDOM操作系が一番だな
以下、繰り返しのサンプル
HTML
https://pastebin.com/m1jG6UMf
JS
https://pastebin.com/BZ9daPTJ
↓出力結果
https://i.imgur.com/JL8ebLX.png
以下、繰り返しのサンプル
HTML
https://pastebin.com/m1jG6UMf
JS
https://pastebin.com/BZ9daPTJ
↓出力結果
https://i.imgur.com/JL8ebLX.png
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★2 [蚤の市★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★7 [蚤の市★]
- 最新版Z級クソ映画ランキングが決定! [牛丼★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★2 [蚤の市★]
- 公用車カーナビのNHK受信料「全額免除を」 千葉市議会、国に制度創設求める意見書可決 [少考さん★]
- 【安倍の実】大誤算!日本企業、円安で苦しむ、、適正為替より大幅に乖離。助けて高市 [219241683]
- 【朗報】南鳥島のレアアース、中国産の「20倍の純度」青山繁晴氏「日本は資源大国」日本復活のファンファーレが鳴り響く! [673057929]
- 愛国者「釘を使わない日本独自の伝統工法スゴイ!」X民「それ中国起源ですよ」→批判殺到 [834922174]
- チー牛のワイでもトー横行けば彼女できるかな
- 高市応援団の筆頭格「高市政権が誕生したのは12月1日だ!!!」 [931948549]
- 👊😅👊三☁😶‍🌫三⛅🏡
