• 移动端基于HTML模板和JSON数据的JavaScript交互


    写本文之前,我正在做一个基于Tab页的订单中心:

    每点击一个TAB标签,会请求对应状态的订单列表。之前的项目,我会在js里使用 +  连接符连接多个html内容:

    var html = '';
    html += '<div class="empty-list">' + 
        '<div class="icon icon-box"></div>'+
        '<div>还没有订单</div>'+
    '</div>';

    Html内容少点还好,但是当内容多起来的时候,再使用这种方式,以后维护起来不方便,也影响美观,可阅读性差。

    突然想起来PHP模板的相关知识,那么应该也有类似JavaScript模板一说。由于为了快速使用在项目上,就去网上找了找。还真有:

    基于HTML模板和JSON数据的JavaScript交互 
    http://www.zhangxinxu.com/wordpress/2012/09/javascript-html-json-template/

    看了下文章,使用起来还是蛮简单的:

    1、准备好html模板

    复制代码
    <textarea class="js-order-tmp" style="display:none;">
        <!--goods-block-->
        <div class="block m-s-order">
            <div class="block-item block-news">
                <a href="<?php echo site_url('order/detail/'. '$id$')?>" class="dis-block external">
                    <div class="item-img">
                        <img src="$thumb$"/>
                    </div>
                    <div class="item-intro">
                        <div class="sub-l">
                            <p class="t-order-num">订单号:$order_num$</p>
                            <p class="t-name">收件人:$cus_name$</p>
                            <p class="t-date">$create_time$</p>
                        </div>
                        <div class="sub-r">
                            <p class="t-expand"><span class="icon icon-right"></span></p>
                            <p class="t-flag">$flag_name$</p>
                        </div>
                    </div>
                    <div class="clear"></div>
                </a>
            </div>
        </div>
        <!--/goods-block-->
    </textarea>
    
    <textarea class="js-no-order-tmp" style="display:none;">
        <!-- no order -->
        <div class="empty-list">
            <div class="icon icon-box"></div>
            <div>还没有订单</div>
        </div>
        <!-- /no order -->
    </textarea>
    复制代码

    其中变量部分全部用两个美元符号 $ 表示。

    2、模板方法很简单,直接写一个基于字符串原型的扩展方法,确保全局可用:

    String.prototype.temp = function(obj) {
        return this.replace(/$w+$/gi, function(matchs) {
            var returns = obj[matchs.replace(/$/g, "")];        
            return (returns + "") == "undefined"? "": returns;
        });
    };

    主要使用到了正则知识。

    3、准备json数据:

    复制代码
    {
        "ecd": 0,
        "msg": "成功",
        "result": [{
            "id": "32",
            "order_num": "test-001",
            "title": "test",
            "thumb": "http://40DA1265-40F6-D622-8BA5-04BA0AF72573.jpg",
            "item_id": "21",
            "price": "0.11",
            "cus_name": "test",
            "cus_tel": "10086",
            "cus_address": "北京 北京海淀区",
            "flag": "5",
            "create_time": "20160329115544",
            "update_time": "20160330120001",
            "flag_name": "订单已取消"
        }],
        "locate": ""
    }
    复制代码

    4、使用ajax请求并显示数据

    复制代码
    $.progress_show('正在努力加载中');
        
    $.ajax({
        url: site_url + 'api/order/getAll/' + status,
        type: 'get',
        dataType: 'json',
        error: doAjax.error,
        success: function (response) {
            $.progress_hide();
    
            if (response.ecd == '0') {
                var htmlList = '', htmlTemp = $("textarea.js-order-tmp").val();
    
                if(typeof response.result === 'undefined'){
                    htmlList = $("textarea.js-no-order-tmp").val();
                }else{
                    $.each(response.result, function(i,el) {
                        htmlList += htmlTemp.temp(el);
                    });
                }
    
                $('.js-status-' + status).empty().append(htmlList);
    
                return true;
            } else {
                return $.alert(response.msg);
            }
        },
    });
    复制代码

    这里的部分方法没有给出,大家知道流程、原理即可。通过点击TAB标签,就可以显示数据了:

    非常感谢博主张鑫旭提供的思路及文章!详情可阅读:

    基于HTML模板和JSON数据的JavaScript交互 « 张鑫旭-鑫空间-鑫生活
    http://www.zhangxinxu.com/wordpress/2012/09/javascript-html-json-template/

    更新:

    使用laytpl模板引擎

    在使用过程发现,对于复杂的json数据, String.prototype.temp 就不适用了。例如

    复制代码
    <div>
        <h1>$title$</h1>
        <ul>
            <li>姓名:$list.name$</li>
            <li>城市:$list.city$</li>
        </ul>
    </div>
    
    
    var data = {
        title: 'test',
        desc: {name: 'Dem', city: '北京'},
    };
    复制代码

     其中 titletitle  是正常渲染的,而姓名和城市就显示不出来了。这就需要去优化 String.prototype.temp 方法了。

    这里为了快速的应用于项目上,使用了网上已经存在的JavaScript模板引擎:laytpl。大小1.77kb,足够mini了。

    用法很简单,引入 laytpl.js 后,只要把前文讲到的稍微改改就行了:

    模板:

    复制代码
    <div>
        <h1>{{d.title}}</h1>
        <ul>
            <li>姓名:{{d.list.name}}</li>
            <li>城市:{{d.list.city}}</li>
        </ul>
    </div>
    复制代码

    需要将两个美元符号 $$ 改成花括号 {{ }} ,另外前面加个 d. 。

    js:

    复制代码
    $.each(response.result, function(i,el) {
                                  
        //htmlList += htmlTemp.temp(el);  //htmlTemp为模板内容,el为遍历的数据对象,htmlList为渲染后的内容
        
        //改为:
        htmlList += laytpl(htmlTemp).render(el);
    });

    $('.js-status-' + status).empty().append(htmlList);
    复制代码

    ok了。想了解更多去其官网看吧:

    laytpl官网 - 精妙的JavaScript模板引擎
    http://laytpl.layui.com/

    总结

    1、String.prototype.temp方法让我们了解了js模板实现的原理,打开了了解js模板引擎的大门;

    2、对于简单的数据展示,String.prototype.temp还是可以用的;

    3、复杂的数据结构,如果有时间和能力去优化String.prototype.temp方法也是可以的;或者直接使用第三方的laytpl、artTemplate、doT、baiduTemplate、kissyTemplate等模板引擎。

  • 相关阅读:
    AcWiing 翻硬币
    AcWing 飞行员兄弟 二进制枚举
    AcWing 费解的开关 二进制枚举
    vue发送短信逻辑
    使用celery异步发送短信
    celery配置与基本使用
    celery原理与组件
    短信验证接口
    图片验证码接口
    编写注册接口
  • 原文地址:https://www.cnblogs.com/jokerjason/p/5709454.html
Copyright © 2020-2023  润新知