<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模板語(yǔ)言引擎, 輕松處理json數(shù)據(jù)! jtle是個(gè)簡(jiǎn)單的javascript板模解析器,可以輕松操作json數(shù)據(jù),基于json數(shù)據(jù)的ajax應(yīng)用可以很方便的實(shí)現(xiàn)數(shù)據(jù)顯示邏輯!

    修改了在firefox下不能正確運(yùn)行問題!

    一、測(cè)試?yán)?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實(shí)戰(zhàn)教程", author:"李永勝", plsh:"李永勝出版社", price: "50.00"},
                            {name:"ajax and jtle文檔", author:"李永勝", plsh:"李永勝出版社", price: "0.00"},
                            {name:"spring webflow教程", author:"李永勝", plsh:"李永勝出版社", price: "60.00"},
                            {name:"dwr應(yīng)用", 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>價(jià)格</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 實(shí)現(xiàn)代碼

      String.prototype.xsplit = function(regex) {
      var item = this; //this指?jìng)鬟^(guò)來(lái)的字符串
      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 "";
     }
     /*
      * 說(shuō)明: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("請(qǐng)指定輸出目標(biāo)DIV id");
           return;
         }
         if(!this.options || !this.options.el) {
           alert("new jtle(options)參數(shù)有誤");
           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;
       };
      
     }

    三、效果圖


    備注: 當(dāng)前實(shí)現(xiàn)只是初稿,  歡迎討論交流. 原創(chuàng)文章,如需轉(zhuǎn)載,請(qǐng)注明出處!

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

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

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    相冊(cè)

    收藏夾

    博客好友

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲av永久综合在线观看尤物| 日韩毛片免费一二三| 女性无套免费网站在线看| 免费国产黄网站在线看| 久久久久久亚洲精品中文字幕| 色se01短视频永久免费| 九九久久精品国产免费看小说| 亚洲最大的成网4438| 韩国日本好看电影免费看| 成人免费ā片在线观看| 亚洲人成影院在线高清| 国产亚洲情侣一区二区无码AV| 青娱分类视频精品免费2| 国产福利电影一区二区三区,免费久久久久久久精 | 狠狠亚洲狠狠欧洲2019| A在线观看免费网站大全| 亚洲国产免费综合| 亚洲国产精品综合久久20| 久久亚洲精品无码观看不卡| 最近最新的免费中文字幕| 久操免费在线观看| 免费无码国产V片在线观看| 亚洲国产品综合人成综合网站| 亚洲午夜久久久久妓女影院| 国产精品高清全国免费观看| 69精品免费视频| 久久九九久精品国产免费直播| 亚洲精品色播一区二区 | 亚洲视频在线免费| 亚洲综合一区国产精品| 亚洲色偷偷av男人的天堂| 国产午夜亚洲精品午夜鲁丝片| 国产高清免费在线| 最近2019中文免费字幕| 69免费视频大片| 三年片在线观看免费大全电影| 一级黄色免费大片| 国产亚洲日韩在线a不卡| 亚洲女子高潮不断爆白浆| 亚洲手机中文字幕| 久久亚洲熟女cc98cm|