zoukankan      html  css  js  c++  java
  • Ajax+innerHTML+Dgls=好的用户体验+高性能+高效率

    为了引入Dgls,我们从创建Dom节点说起。

    用JS创建Dom节点

    var div = document.createElement('div');
    div.className = 'gdls';
    var test = document.createTextNode('zhe');
    div = div.appendChild(test);

    看到没,我们仅仅为了创建<div class="dgls">zhe</div>竟然写了四行代码,而且用了那么多无用的字符。

    用JQ创建Dom节点

    $('div',{
        'class': 'dgls',
        'id': 'dgls',
        'css':{
            'border': '1px solid green'
        },
        'html': $('<a>', {
            href: '#',
            html: 'hello world',
        })
    });

    这个看起来比JS的要爽多了,而且可以嵌套子节点。可是<div><a></a><a></a></div>怎么创建呢?难道要用两个html,显然是不行的。

    <div></div><div></div>这个标签又怎么创建呢?也许不行吧。

    用字符串创建Dom结点

    '<div></div><div></div>'
    '<div><a></a><a></a></div>'

    我只能说这个是最简单的了,但是局限性也就大了。我要动态加个class属性,就要使用+号来连接字符串,如果我要创建一个复杂且庞大的结构,不知道要用多少个+号,不便于阅读。更严重的是+号的效率低下啊,尽管后来JS改善了+号的性能。

    用Dgls创建Dom结点

    _('div',
        _('a', {'href': 'www.baidu.com'}, 'baidu'),
        _('a', {'href': 'www.cnblogs.com'}, 'google')
    ).string();
    /*
    <div><a href="www.baidu.com">baidu</a><a href="www.cnblogs.com">google</a></div> 
    */
    _('div', {'class': 'dgls'}, '1').concat(
    _('div', {'class': 'dgls'}, '2')).string();
    /*
    <div class="dgls">1</div><div class="dgls">2</div> 
    */

    只要是你能够想得到的结构,Dgls都能够创建!当然Dgls创建的都是字符串,只要与innerHTML结合使用就可以将字符串转化为Dom节点了,而且innerHTML性能也是不错的,甚至超过了JS,当我们要大量创建dom元素的时候。

    揭开Dgls神秘的面纱

    Dgls是Dynamically Generate Lable String。换句话说,也就是动态生成标签字符串的意思,刚刚大家也见识了它的魅力了。

    Dgls源码

    下面我就贴出Dgls的源码,欢迎大家指教!

    (function(Global, undefined){
        function Dgls(tagName, tagAttr, single){
            this._name = tagName;
            this._attr = tagAttr;
            this._single = single;
            this._brother = [];
            this._children = [];
        }
    
        Dgls.extend = function(obj){
            var proto = this.prototype;
            for(name in obj){
                if((typeof proto[name] != 'function') && (typeof obj[name] == 'function')){
                    proto[name] = obj[name];
                }else{
                    throw 'The method of ' + name + ' has exsited!';
                }
            }
        };
    
        Dgls.extend({
            attr: function(key, value){
                var len = arguments.length;
                if(len == 2){
                    if(value !== undefined){
                        this._attr[key] = value;
                    }
                }else if(len == 1){
                    var k;
                    for(k in key){
                        if(key[k] !== undefined){
                            this._attr[k] = key[k];
                        }
                    }
                }
                return this;
            },
            push: function(tag){
                this._children.push(tag);
                return this;
            },
            unshift: function(tag){
                this._children.unshift(tag);
                return this;
            },
            concat: function(tag){
                this._brother = this._brother.concat(tag);
                return this;
            },
            string: function(){
                var arr = [],
                    tmp = [],
                    arrlen = 0;
                    arr[arrlen++] = '<';
                    arr[arrlen++] = this._name;
                for(var key in this._attr){
                    tmp[0] = ' ';
                    tmp[1] = key;
                    tmp[2] = '="';
                    tmp[3] = this._attr[key];
                    tmp[4] = '"';
                    arr[arrlen++] = tmp.join('');
                }
                arr[arrlen++] = '>';
                if(!this._single){
                    this._children.map(function(tag){
                        if(tag != undefined) {
                            if(tag instanceof Dgls){
                                arr[arrlen++] = tag.string();
                            }else if(typeof tag == 'string'){
                                arr[arrlen++] = tag;
                            }
                        }
                    });
                    arr[arrlen++] = '</';
                    arr[arrlen++] = this._name;
                    arr[arrlen++] = '>';
                }
                this._brother.map(function(tag){
                    if(tag != undefined) {
                        if(tag instanceof Dgls){
                            arr[arrlen++] = tag.string();
                        }else if(typeof tag == 'string'){
                            arr[arrlen++] = tag;
                        }
                    }
                });
                return arr.join('');
            },
            childs: function(){
                var arr = [],
                    arrlen = 0;
                this._children.map(function(tag){
                    if(tag != undefined) {
                        if(tag instanceof Dgls){
                            arr[arrlen++] = tag.string();
                        }else if(typeof tag == 'string'){
                            arr[arrlen++] = tag;
                        }
                    }
                });
                return arr.join('');
            }
        });
    
        var dgls = function(tagName){
            var attrs = {},
                obj,
                i = 1;
            if(arguments[1] != 's'){
                if((arguments[1] instanceof Object) && !(arguments[1] instanceof Dgls)){
                    attrs = arguments[1];
                    i = 2;
                }
                obj = new Dgls(tagName, attrs, false);
            }else{
                i = 2;
                if((arguments[2] instanceof Object) && !(arguments[2] instanceof Dgls)){
                    attrs = arguments[2];
                    i = 3;
                }
                obj = new Dgls(tagName, attrs, true);
            }
            for(var length = arguments.length; i<length; i++){
                obj.push(arguments[i]);
            }
            return obj;
        };
    
        Global._ = dgls;
        Global.Dgls = Dgls;
    })(window);
    View Code

    Dgls项目

    项目地址:https://github.com/ysyfff/Dgls

    有关Dgls的更多用法以及Dgls的扩展,请参见项目中的README。

    欢迎大家来Fork!与参与。

  • 相关阅读:
    Openfire 调试信息
    ejabberd分析(三)启动流程
    Openfire 离线消息的处理机制
    OpenFire SSLSocketFactory 编译报错解决
    用消息队列和消息应用状态表来消除分布式事务
    XMPP文件传输过程
    ejabberd分析(一)
    erlang(1)
    Openfire 好友状态的发送(用户登录)
    ejabberd分析(二) 用户注册
  • 原文地址:https://www.cnblogs.com/JChen666/p/3418007.html
Copyright © 2011-2022 走看看