<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 7,  comments - 58,  trackbacks - 0

        自編 jtle(javascript template language engine) javascript模板語言引擎, 輕松處理json數據! jtle是個簡單的javascript板模解析器,可以輕松操作json數據,基于json數據的ajax應用可以很方便的實現數據顯示邏輯!

    修改了在firefox下不能正確運行問題!

    一、測試例子(testJtle.html)

    <html>
    <head>
     <script src="jtle.js"></script>
     <script>
       window.onload = function() {
         var menus = new jtle({el:"source"});
          menus.parse({menus:[{url:"http://www.163.com",subject: "163.com"}, {url:"http://www.baidu.com",subject: "百度"}]});
          var books = new jtle({el:"bookList"});
          books.parse({books:[
                            {name:"hibernate實戰教程", author:"李永勝", plsh:"李永勝出版社", price: "50.00"},
                            {name:"ajax and jtle文檔", author:"李永勝", plsh:"李永勝出版社", price: "0.00"},
                            {name:"spring webflow教程", author:"李永勝", plsh:"李永勝出版社", price: "60.00"},
                            {name:"dwr應用", author:"李永勝", plsh:"李永勝出版社", price: "30.00"}
                           ]});
       };
     </script>
    </head>
    <body>
      <div id="source">
       <%
          for(var i = 0; i < menus.length; i++) {
            var menu = menus[i];
       %>
       <a href="${menu.url}">${menu.subject}</a>
       <% } %>
     </div>
     <div id="bookList">
       <table width="80%">
         <tr bgcolor="#DEB887"><td>書籍名稱</td><td>作者</td><td>出版社</td><td>價格</td></tr>
         <% for(var n = 0; n < books.length; n++) {
              var book = books[n];
              if(n % 2 != 0) {
          %>
          <tr bgcolor="#DCDCDC"><td>${book.name}</td><td>${book.author}</td><td>${book.plsh}</td><td>${book.price}</td></tr>
         <% }else{   %>
           <tr bgcolor="#FFFFE0"><td>${book.name}</td><td>${book.author}</td><td>${book.plsh}</td><td>${book.price}</td></tr>
         <% } }  %>
       </table>
     </div>
    </body>
    </html>

    二、jtle.js 實現代碼

      String.prototype.xsplit = function(regex) {
      var item = this; //this指傳過來的字符串
      var result = regex.exec(item);
      var retArr = new Array();
      while(result != null){
        var first_idx = result.index;
        if(first_idx != 0) {
          var first_bit = item.substring(0, first_idx);
          retArr.push(first_bit);
        }
        retArr.push(result[0]);
        item = item.slice(first_idx+result[0].length);
        result = regex.exec(item);
      }
      if(item != '' && item != null){
       retArr.push(item);
      }
      return retArr;
     };
     function _toString(val){
       if(val == null || val === undefined){
           return "";
       }
       if(val instanceof Date){
         return val.toDateString();
       }
      if(val.toString) {
         return val.toString();
       }
       return "";
     }
     /*
      * 說明:js腳本模板引擎
      * 作者:lys
      * @param options {el: "elId", _target:"編譯后輸出容器div id"}
      */
     function jtle(options) {
       this.source = " "; //待編譯的模板代碼
       this.element; //板模源容器
       this.script = "var _html = \"\";";
       this._htmlVar = "_html += ";
       this.buffer = "";
       this._target = document.getElementById(options._target);
       this.split_source = [];
       this.left_delimiter = "<js>";
       this.right_delimiter = "</js>";
       this.left_writer = "$j{";
       this.right_writer = "}";
       this.startTag = null;
       this.options = options;
        
       this.compile = function() {
         if(this._target == null) {
           alert("請指定輸出目標DIV id");
           return;
         }
         if(!this.options || !this.options.el) {
           alert("new jtle(options)參數有誤");
           return;
         }
         this.element = document.getElementById(this.options.el);
         if(!this.element) {
           alert("指定的板模源不合法");
           return;
         }
         this.source = this.element.value.toLowerCase();
         this.format();
         this.scan();
       };
       this.parse = function(data) {
         this.compile();
         this.script = "(function(){ with(data) {" + this.script + "} return _html;})();";
         var out = eval(this.script);
         this._target.innerHTML = out;
       };
       this.scan = function() {
         this.split_source = this.source.xsplit(/\n/);
         var len = this.split_source.length;
         for(var i = 0; i < len; i++) {
           var item = this.split_source[i];
           this.scanline(item);
         }
       };
       this.scanline = function(item) {
         var regex = /(<js>)|(<\/js>)|(\$j\{(\w*\.\w*)\})|(\n)/;
         var line_split = item.xsplit(regex);
         var len = line_split.length;
         for(var i = 0; i < len; i++) {
           var token = line_split[i];
            if(token != null) {
            this.appendBuffer(token);
           }
         }
       };
       this.appendBuffer = function(token) {
          if(token) {
           var rst = token;
           if(token.indexOf("$j{") > -1) {
             if(this.buffer != "") {
               this.buffer = this._htmlVar + "\"" + this.clean(this.buffer) + "\";";
               this.fush();
             }
             rst = rst.replace(/(\$j\{)/g, "");
             rst = rst.replace(/\}/g, "");
             this.buffer = this._htmlVar + "_toString(" + rst + ");";
             this.fush();
             return;
           }
          }
          if(this.startTag == null) {
            switch(token) {
            case "\n":
             this.buffer = this.buffer + "\n";
             this.buffer = this._htmlVar + "\"" + this.clean(this.buffer) + "\";";
             this.fush();
             break;
            case this.left_delimiter:
              if(this.buffer != "") {
              this.buffer = this._htmlVar + "\"" + this.clean(this.buffer) + "\";";
              this.fush();
             }
             this.startTag = this.left_delimiter;
             break;
            case this.right_delimiter:
              if(this.buffer != "") {
                this.fush();
              }
              break;
            default:
              this.buffer = token;
             break;
           }
          }else{
            switch(token) {
           case this.right_delimiter:
           case "\n":
             if(this.buffer != "") {
               this.fush();
             }
            break;
           default:
             this.buffer = token;
            break;
           }
           if(token == this.right_delimiter) {
             this.startTag = null;
           }
        }
        
      };  
       this.fush = function() {
         this.script = this.script + this.buffer + "\n";
         this.buffer = "";
       };
       this.format = function() {
         this.source = this.source.replace(/(\r\n)/g, "\n");
         this.source = this.source.replace(/\r/g, "\n");
         this.source = this.source.replace(/(\n\r)/g, "\n");
       };
       this.clean = function(txt) {
         txt = txt.replace(/\n/g, "\\n");
         txt = txt.replace(/"/g,  "\\\"");
         return txt;
       };
      
     }

    三、效果圖


    備注: 當前實現只是初稿,  歡迎討論交流. 原創文章,如需轉載,請注明出處!

    posted on 2008-05-25 10:24 Sonny Li 閱讀(2293) 評論(4)  編輯  收藏 所屬分類: javascript編程語言

    FeedBack:
    # re: 自編 jtle(javascript template language engine) javascript模板語言引擎, 輕松處理json數據!
    2008-05-25 23:29 | 陳小穩
    看了下,在需要ajax動態變更數據內容,而數據呈現樣式比較復雜的時候比較適用,只是在jsp里面有點沖突了,因為 <% %>是用來包裹java語句的。  回復  更多評論
      
    # re: 自編 jtle(javascript template language engine) javascript模板語言引擎, 輕松處理json數據!
    2008-05-25 23:43 | 無羽蒼鷹
    在ajax應用中,個人認為,.jsp文件只寫java代碼,不包括任何的html和javascript。應用javascript template的地方應該是.html而不是.jsp  回復  更多評論
      
    # re: 自編 jtle(javascript template language engine) javascript模板語言引擎, 輕松處理json數據!
    2008-05-26 00:16 |
    <%%>,$ 等最好要參考標準,最好不要和現在有的標準沖突。。不過8 錯,8錯。。主要是有這個思想。。  回復  更多評論
      
    # re: 自編 jtle(javascript template language engine) javascript模板語言引擎, 輕松處理json數據![未登錄]
    2012-04-13 17:00 | Sonny Li
    離技術越來越遠了  回復  更多評論
      
    <2012年4月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    收藏夾

    博客好友

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: va亚洲va日韩不卡在线观看| 免费A级毛片无码免费视| 日本免费一区二区久久人人澡| 免费人成毛片动漫在线播放| 99热在线精品免费播放6| 在人线av无码免费高潮喷水| 在线精品免费视频无码的| 无码不卡亚洲成?人片| 亚洲一区二区三区偷拍女厕| 久久亚洲精品人成综合网| 亚洲精品伊人久久久久| 久久亚洲精品高潮综合色a片| 一级黄色免费网站| 99精品视频免费在线观看| 无码日韩精品一区二区免费| 亚洲AⅤ无码一区二区三区在线| 亚洲AV永久无码精品成人| 亚洲一级大黄大色毛片| 一级做受视频免费是看美女| 99久久99久久免费精品小说| 日韩精品视频免费在线观看| 国产A在亚洲线播放| 亚洲色大成网站WWW国产| 久久最新免费视频| 四虎精品视频在线永久免费观看| 国产在线观看免费视频播放器| 国产亚洲精品xxx| 在线精品亚洲一区二区| 国产免费内射又粗又爽密桃视频| 亚洲精品在线免费观看视频| 国产免费看插插插视频| 777亚洲精品乱码久久久久久| 久久久亚洲精华液精华液精华液| 中文字幕视频在线免费观看| 最近2019中文字幕mv免费看| 亚洲中文字幕无码一区二区三区| 亚洲天堂免费在线| 美女被cao网站免费看在线看| 女人让男人免费桶爽30分钟| 亚洲成av人在线视| 精品国产日韩亚洲一区91|