[DikeJS]关于js模板技术,使用requireJS定义模块(七)

最近由于需求改变,我又改写了Template模板方法,此次的改动增加了XXX:{XXX}的标签替换和独立的{XXX}替换,执行顺序为XXX={XXX} -> XXX:{XXX} -> {XXX},代码如下:

/**
 * @Author Dike.Li
 * @Date 2015/8/14
 * @class Template
 * @public
 * @Description Template Label Replace
 */
define(function (require) {

    /**
     * 提取模板中 XXX=‘{XXX}‘ || XXX="{XXX}"
     * @type {RegExp}
     */
    var regExp = new RegExp(‘[a-zA-Z]+[\\s]*=[\\s]*[\"\‘]\\{[^\\{\\}]+\\}[\"\‘]‘, ‘\g‘);

    /**
     * 提取标签正则表达式 {XXX}
     * @type {RegExp}
     */
    var regExpLable = new RegExp(‘\\{[^\\{\\}]+\\}‘, ‘\g‘);
    /**
     * 提取标签中的名称 {XXX} -> XXX
     * @type {RegExp}
     */
    var regExpLabelName = new RegExp(‘[^\\{\\}]+‘, ‘\g‘);

    /**
     * 提取模板中的XXX:{XXX}内容
     * @type {RegExp}
     */
    var regExpColon = new RegExp(‘[a-zA-Z]+[\\s]*:[\\s]*\\{[^\\{\\}]+\\}‘, ‘\g‘);

    /**
     * 将数组转换为字符串
     * @param str
     * @returns {*}
     */
    var convertString = function (obj) {
        var str = obj;
        if (obj instanceof Array) {
            str = obj.join(‘‘);
        }
        return str;
    };

    /**
     * 要求模板中的{id}标签与option中的属性{id:123}一致
     * @param temp 模板
     * @param option 属性设置
     * @returns {*}
     * @constructor
     */
    var getTemp = (function (temp, option) {
        /**
         * 进行类型处理
         * @type {*}
         */
        temp = convertString(temp);

        /**
         * 提取 XXX=‘{XXX}‘ || XXX="{XXX}" 格式的数组
         * @type {Array|{index: number, input: string}|*}
         */
        var alArr = temp.match(regExp);

        /**
         * 根据option中的属性配置项翻译模板内容,并将不存在的标签删除 限定格式(XXX={XXX})
         */
        for (var al in alArr) {

            /**
             * 获取标签
             */
            var label = alArr[al].match(regExpLable)[0];

            /**
             * 获取标签名称
             */
            var labelName = label.match(regExpLabelName)[0];

            if (typeof(option[labelName]) === ‘undefined‘ ||
                option[labelName] === null ||
                option[labelName] === ‘null‘ ||
                option[labelName] === ‘‘) {
                temp = temp.replace(alArr[al], ‘‘);
                continue;
            }

            temp = temp.replace(label, option[labelName]);
        }

        /**
         * 继续过滤内容为XXX:{XXX}
         */
        var colonArrs = temp.match(regExpColon);
        for (var ca in colonArrs) {
            /**
             * 获取标签
             */
            var cLabel = colonArrs[ca].match(regExpLable)[0];
            /**
             * 获取标签名
             */
            var cLabelName = cLabel.match(regExpLabelName)[0];

            if (typeof(option[cLabelName]) === ‘undefined‘ ||
                option[cLabelName] === null ||
                option[cLabelName] === ‘null‘ ||
                option[cLabelName] === ‘‘) {
                temp = temp.replace(colonArrs[ca], ‘‘);
                continue;
            }
            temp = temp.replace(cLabel, option[cLabelName]);
        }

        /**
         * 最后替换内容为{XXX}
         */
        var tempArrs = temp.match(regExpLable);
        for (var ta in tempArrs) {
            /**
             * 获取名字
             * @type {Array|{index: number, input: string}}
             */
            var taLabelName = tempArrs[ta].match(regExpLabelName)[0];
            if (typeof(option[taLabelName]) === ‘undefined‘ ||
                option[taLabelName] === null ||
                option[taLabelName] === ‘null‘ ||
                option[taLabelName] === ‘‘) {
                temp = temp.replace(tempArrs[ta], ‘‘);
                continue;
            }

            temp = temp.replace(tempArrs[ta], option[taLabelName]);
        }
        return temp;
    });

    return {
        getTemp: getTemp
    }
});

应用模板:

<div id="container_viewport_layout_main" class="container_viewport_layout_main">
    <div class="container_viewport_layout_top" style="display: {top_hide}">
        <h2>
            <div id="{top_id}" class="container_viewport_layout_toptitle">{top_name}</div>
            <div class="container_viewport_layout_topsj"><img src="Component/view/container/Viewport/images/top-sj.png" width="29" height="23"/></div>
        </h2>
    </div>

    <div class="container_viewport_layout_left">
        <div class="container_viewport_layout_tabox">
            <h2>
                <div class="container_viewport_layout_lefttitle">标题</div>
                <div class="container_viewport_layout_leftsj"><img src="Component/view/container/Viewport/images/left-sj.png" width="29" height="23"/>
                </div>
            </h2>
        </div>
    </div>
    <div class="container_viewport_layout_middle"></div>
    <div class="container_viewport_layout_right">
        <h2>
            <div class="container_viewport_layout_righttitle">标题</div>
            <div class="container_viewport_layout_rightsj"><img src="Component/view/container/Viewport/images/right-sj.png" width="29" height="23"/></div>
        </h2>
    </div>
    <div class="container_viewport_layout_bottom">
        <h2>
            <div class="container_viewport_layout_bottomtitle">标题</div>
            <div class="container_viewport_layout_bottomsj"><img src="Component/view/container/Viewport/images/bottom-sj.png" width="29" height="23"/>
            </div>
        </h2>
    </div>
</div>

实际应用例子:

new (require(‘Viewport‘))({
    top_name:‘top name‘,
    top_hide:‘block‘,
    top_id:‘asdasd‘,
    render:$(‘body‘)
});

效果图:

时间: 2024-10-17 03:22:23

[DikeJS]关于js模板技术,使用requireJS定义模块(七)的相关文章

[DikeJS]关于js模板技术,使用requireJS定义模块(四)

前几次对模板技术进行了分析和编写,发现不是很合理,现在发上新的改良代码: /**  * @Author Dike.Li  * @Date 2015/7/30  * @class Template  * @public  * @Description Template Label Replace  */ define(function (require) {     /**      * 提取模板中 XXX='{XXX}' || XXX="{XXX}"      * @type {Reg

requirejs 定义模块中含有prototype

因为我对requirejs不熟悉,不清楚如何定义带有prototype的模块, 在看了:https://gist.github.com/jonnyreeves/2474026 的demo之后,就明白了,呦西. person.js的注释中提到requireJS simply requires us to return  a single value (function / Object) which represents this definition. In our case, we will

关于js模板技术,使用requireJS定义模块(一)

前段时间查看了extjs的源代码,大概就看了20多分钟,我看了个大概,曾经推测Extjs动态创建组件其实也是使用了标签模板,如今看过源码之后证实了我的猜测,extjs拥有自己的一套模块加载器,所以能够自由的编写自定义组件等更多强大的功能.       现在我也想仿写一套extjs这么强大工具,那么我就需要考虑组件模块化的问题,其次就是模板的编写,样式的自由扩展和模块的自由定义等,不过还好,js这么强大的语言周边的工具总是很多,模块化的组件例如requireJS和seaJS都是非常不错的选择,se

关于js模板技术,使用requireJS定义模块(二)

昨天编写了第一版的模板标签替换代码,发现有很多不足的地方,不足内容如下: 1:正则无法匹配模板中存在的空格问题 2:无法删除属性项中不存在的标签 根据昨天的不足,经过修正后,新的模板替换方法如下: /**  * @Author Dike.Li  * @Date 2015/7/30  * @Description Template Label Replace  */ define(function (require, exports, module) {     /**      * 要求模板中的

Requirejs定义模块

模块可以很好的定义作用域来避免全局名称空间污染,它可以显示的定义出函数间的依赖关系,而不需要引用全局变量. RequireJS可以加载多个不同的模块,虽然加载的顺序不一样,但是能保证依赖的顺序是正确的. 1.  当模块中只有键值对时,可通过如下方式定义. define({     name : "beautiful",     color: "yellow",     size: "3M"}); 2. 当模块中没有依赖,只有函数时,模块的格式如下

JS之模板技术(aui / artTemplate)

artTemplate是个好东西啊,一个开源的js前端模板引擎,使用简单,渲染效率特别的高. 我经常使用这个技术来在前端动态生成新闻列表,排行榜,历史记录等需要在前端列表显示的信息. 下面是artTemplate的下载链接: https://github.com/aui/artTemplate 因为artTemplate比较简单,容易上手,项目的例子,文档又比较齐全,大家有需要可以直接参考官方文档,例子进行深入了解, 我这里就这是用简单常用的,用于快速上手的一个例子吧! 先说明,我是下载artT

html+js+PHP(使用了smarty模板技术)+mysql实现二级动态下拉列表(select)

目标 需要的是在选择第一个select下拉列表后,将选择的内容传送到PHP页面.在PHP页面中通过查询数库,得到第二个select需要显示的option的值,并在select中显示. 方案 1  利用ajax上传数据到PHP,由于利用了smarty模板技术,可以直接给模板中的变量赋值,这样就可以不用通过ajax接收返回值再经过处理输出了. 由于这个PHP页面没有包含在其他PHP页面里,是独立的.这样就造成无法赋值. 2  通过ajax接收返回值,这里的返回值就是以上数据库查询的结果. 通过jso

js前端技术

一.前端技术 1.HTML HTML(hypertext markup language)超文本标记语言,不同于编程语言. 超文本就是超出纯文本的范畴,描述文本的颜色.大小.字体. HTML由一个个标签组成,标签各司其职,有的提供网页信息,有的负责图片,有的负责网页布局. 超文本需要显示,就得有软件呈现超文本定义的排版格式,,例如显示图片.表格.显示字体的大小,颜色,软件就是浏览器. 超文本的诞生是为了解决纯文本不能格式显示问题,是为了好看,但是只用通过网络分享超文本的内容,所以制定了HTTP协

MVC下的客户端模板技术

1.引言 在Web编程中,我们有时经常需要使用Ajax来访问服务端的接口,然后使用这些返回的数据(一般格式都是JSON)来展示客户端的相关信息.例如:在一个商品列表,我们点击某一样的商品,查看该商品的信息信息.这时通过指定的ID来获取商品详细信息后,我们很多时候都是讲HTML和JavaScript结合起来.通过构造HTML标签和JS的填充来展示相关的界面.这样大量的标签拼接,一来不容易维护,二来也导致在编码过程中容易出现错误.今天我给大家做一下客户端模板技术的简单介绍.希望可以通过这个技术在一定