Skip to content

Instantly share code, notes, and snippets.

@canujohann
Last active August 29, 2015 14:01
Show Gist options
  • Save canujohann/dbdeb343fd6e81bd02d6 to your computer and use it in GitHub Desktop.
Save canujohann/dbdeb343fd6e81bd02d6 to your computer and use it in GitHub Desktop.
javascript: template engine

javascriptでHTMLを生成したい時は変数に入れて、DOMに挿入する:

//変数に代入
var xx = "<div id='xxx'>hoge hoge</div><h1>hoge boke</h1>";

//jqueryのHMTLメッソードで挿入
$("#mydiv").html(xx);

しかしHTMLが長ければ長いほど、管理しにくくなりますので、テンプレートエンジンを利用するとよい!

一番メジャーなテンプレートエンジンは:

  1. jsRender
  2. Mustache
  3. Underscore Templates
  4. Embedded JS Templates
  5. ...

今日はjqueryのプラグインとして自分で簡単なテンプレートエンジンを作ってみましょう!

参照サイト:http://blog.mach3.jp/2010/09/10/jquery-render-js.html

先ずはテンプレートを扱うメッソードを作ります jqueryのプラグインなので、extendsメッソードを利用

//jqueryプラグイン
$.fn.extend({

    //プラグイン名
    render:function( data ){
    
        //htmlメッソードでテンプレートの内容を取得
        var tmpl = this.html();
        
        //最終的にreturnされる値s
        var result = ""; 
        
        //引数を入れ替えるメッソード
        var create = function(t,d){
          var m = t.match(/\{\{(.+?)\}\}/g) || [], r = t;
          $.each( m, function(i,k){
              var v = d[ k.replace(/\{|\}/g, "") ];
              r = r.replace( k, ( v === undefined ) ? "" : v );
          });
          return r;
        };
        
        //引数がない場合
        if( data === undefined ){ return $( tmpl.replace(/\{\{(.+?)\}\}/g, "") ); }
        
        //引数は配列じゃない
        if( !(data instanceof Array) ){ return $( create(tmpl, data) ); }
        
        //引数は文字列
        $.each( data, function(i,o){ result += create(tmpl,o); } );
        
        return $(result);
    }
});

テンプレート自体を作ります。変数は**{{}}**で囲みます。

<script type="text/html" id="template">
 <ul>
     <li> My name : {{name}} </li>
     <li> My age : {{age}} </li>
 </ul>
</script>

typeの宣言はtext/htmlですよ!

メッソードを呼び出す:

//単一オブジェクト
var data = { name:"johann", age:"28"};
$("#template").render(data).appendTo($("#Container"));

HTML

<div> id="Container"></div>

以上!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment