<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)行問(wè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>書(shū)籍名稱(chēng)</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)  編輯  收藏 所屬分類(lèi): 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文件只寫(xiě)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ù)![未登錄](méi)
    2012-04-13 17:00 | Sonny Li
    離技術(shù)越來(lái)越遠(yuǎn)了  回復(fù)  更多評(píng)論
      
    <2008年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    相冊(cè)

    收藏夾

    博客好友

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 一级特级女人18毛片免费视频| 99久久免费看国产精品| 亚洲精品制服丝袜四区| 亚洲第一网站免费视频| 色综合久久精品亚洲国产| 国产日产亚洲系列| 亚欧免费视频一区二区三区| 亚洲爆乳无码专区www| 亚洲成A∨人片在线观看不卡| 日本一区二区三区免费高清| 成人免费网站久久久| 亚洲美女免费视频| 亚洲欧洲久久av| gogo全球高清大胆亚洲| 亚欧免费无码aⅴ在线观看| 亚洲国产区男人本色| 亚洲成在人线av| 国产在线ts人妖免费视频| 在线免费观看国产| 男女作爱免费网站| 亚洲国产精品免费观看| 亚洲va无码va在线va天堂| 国产精品免费视频网站| 99精品在线免费观看| 成人在线免费视频| 亚洲一线产品二线产品| 亚洲av福利无码无一区二区| gogo全球高清大胆亚洲| 成人毛片18女人毛片免费| 日韩在线永久免费播放| caoporn成人免费公开| 亚洲精品乱码久久久久蜜桃| 内射少妇36P亚洲区| 国产亚洲精品看片在线观看| 国产精品麻豆免费版| 国产成人免费爽爽爽视频 | 国内精品一级毛片免费看| 麻豆69堂免费视频| 亚洲人成色777777老人头| 亚洲毛片免费观看| 亚洲人成电影在线天堂|