一个好用的Tag函数

文章标题提到的Tag函数是基于jquery写的,所以,在使用之前务必要引入jquery文件。该函数主要用于动态创建标签,并获取创建的标签对应的dom对象等。注意:该函数并没有封装成jquery插件的形式,若想改造成jquery插件形式,需要的自己动手啦。

1.Tag函数需要用到其他一些工具函数,代码如下。对于这些工具函数,本人主要是新建一个名字为util.js的文件进行保存。


/**
 * 定义命名空间util
 */
util = {};

/**
 * 测试js是否加载成功
 */
util.test = function() {
    jsout("util.js is working");
};

/**
 * 控制台输出
 */
function jsout(str) {
    console.debug(str);
}
/**
 * 根据id进行查找
 */
function findById(id){
    return $("#"+id+"");
}
/**
 * 创建一个命名空间。 <br>
 * 命名空间是一个全局变量。
 * @param ns 命名空间, 如mgr.system.errorcode
 */
util.namespace = function (ns){
    var names = ns.split(".");
    var upperNs = window;
    $.each(names, function(i, name){
        if(upperNs[name] == undefined){
            upperNs[name] = {};
        }
        upperNs = upperNs[name];
    });
};
ns = util.namespace;

/**
 * 判断一个字符串是否为undefined 或 null或""
 * @param str
 * @returns {Boolean}
 */
util.isNullOrEmpty = function(str){
    return str == undefined || str == null || $.trim(str)=="";
};

util.notNullOrEmpty = function(str){
    return !util.isNullOrEmpty(str);
};
/**
 * 是否为整数
 * @param num
 * @returns
 */
util.isInteger = function(num){
    return /^\d+$/.test(num);
};

/**
 * 将string解析为json对象
 * @param json
 * @returns
 */
util.parseJson = function(json){
    return eval("("+json+")");
};
/**
 * 判断是否为双标签
 * @param tag
 * @returns {Boolean}
 */
util.isDoubleTag = function(tag){
    var singleTags = ["br","input","img"];
    return singleTags.indexOf(tag) < 0;
};

/**
 * 生成随机id
 */
util.id = function(){
    var id = Math.random() + "";
    return id.substring(2);
};

2.有了上述工具函数以后,可以顺利给出Tag的代码了。本人其实是新建了一个名为core.js的文件进行保存的,代码如下:

//namespace
core = {};

function Tag(params){
    if(params == undefined){
        throw ("创建Tag对象时参数不能为空");
        return;
    }
    if(typeof params == "string"){
        var tag = params;
        params = {};
        params.tag = tag;
    }

    //如果没有指定id, 则生成一个随机id
    if(util.isNullOrEmpty(params.id)){
        params.id = util.id();
    }


    //此处列出来的属性可以直接在Tag对象中指定. 未列出的属性需要在其attrs中指定
    var directAttrs = ['id','class','style','type','value', 'width','selected'];
    if(util.notNullOrEmpty(params["cls"])){
        params["class"] = params["cls"];
        delete params.cls;
    }
    //将这此属性值复制到params.attrs对象中
    var attrs = {};
    $.each(directAttrs, function(i, a){
        if(util.notNullOrEmpty(params[a])){
            attrs[a] = params[a];
        }
    });
    if(params.attrs == undefined){
        params.attrs = {};
    }
    $.extend(params.attrs,attrs);

    /*
     * html, text, innerHtml属性都被解析为items
     */
    var items = [];
    var innerHtmlFields = ["html","text","innerHtml"];
    $.each(innerHtmlFields, function(i, f){
        if(params[f]){
            items.push(params[f]);
        }
    });
    if(!params.items){
        params.items = [];
    }
    if(!$.isArray(params.items)){
        var arr = [];
        arr.push(params.items);
        params.items = arr;
    }
    $.merge(items, params.items);
    params.items = items;

    //将params的属性都复制到this对象上
    $.extend(this, params);

    /*绑定事件监听**/
    var listeners = params.listeners;
    for( var listener in listeners){
        if(listener){
            $("body").delegate("#" + params.id, listener, listeners[listener]);
        }
    };

    /*假如指定了containerId或container, 则将创建的标签插入dom中**/
    if(util.notNullOrEmpty(params.containerId)){
        findById(params.containerId).append(this.toHtml());
    }else if(util.notNullOrEmpty(params.container)){
        $(params.container).append(this.toHtml());
    };
    /*标识自己为Tag对象的实例**/
    this._isTagInstance = true;
}

$.extend(Tag.prototype, {
    /*****************************************************public*******************************************************/
    toHtml:function(){

        /*
         * 处理特殊属性
         */
        if(util.notNullOrEmpty(this.attrs["width"])){
            var width = this.attrs["width"];
            if(util.isInteger(width)){
                width += "px";
            }
            if(util.isNullOrEmpty(this.attrs["style"])){
                this.attrs["style"] = "";
            }
            this.attrs["style"] += "width:" + width;
            delete this.attrs["width"];
        }
        /*
         * 拼装属性字符串
         */
        var attrs = " ";
        for(var attr in this.attrs){
            if(this.attrs[attr] != null){
                attrs +=" " + attr + "='" + this.attrs[attr]+ "' ";
            }
        }
        /*
         *处理子元素 
         */
        var items = this.items;
        var innerHtml = "";
        $.each(items, function(i, item){
            if(typeof item == 'object'){
                if(!item._isTagInstance){//普通object, 不是Tag实例
                    item = new Tag(item);//以此object为参数创建一个Tag对象
                }
            }
            innerHtml += item + "";//自动调用item.toString();
        });

        /*
         * 生成HTML
         */
        var tag = this.tag;
        var html = "";
        if(util.isDoubleTag(tag)){
            html = "<" + tag + attrs + ">" + innerHtml+ "</"+ tag+">";
        }else{
            html =  "<" + tag + attrs + "/>";
        }
        this._html = html;
        return this._html;
    },
    insert:function(tag){
        this.items.push(tag);
    },

    /**
     * 重写toString方法
     */
    toString:function(){
        return this.toHtml();
    },
    /**
     * @returns 将tag插入dom中后,可调用此方法获得对应的jquery对象
     */
    $:function(){
        return findById(this.id);
    },
    /**
     * 获取属性值
     * @param attrName
     */
    attr:function(attrName){
        return this.attrs[attrName];
    }

});

core.Tag = Tag;

3.使用示范(前提是引入jquery文件和上述两个文件)


  var tag = new core.Tag({
        tag:"div",//创建一个div标签
        containerId:'',//or container(a jquery selector). 如果指定了这个属性, 标签对象在初始化完成后会自动插入containerId代表的dom对象,并作为其最后一个子节点。比如可以指定body标签的id属性值,则生成的div标签会被插入body中
        html:"ss",//or text, or innerHtml,生成的div标签的文本
        cls:'',// equals to attrs["class"],
        listeners:{//监听器。 可监听jquery支持的事件
            click:function(){},
            focus:function(){}
        },
        attrs:{
            id:'',//指定id属性值
            "class":'',//指定class属性值
            style:'',
            type:'',
            value:'',
            //以上属性也可以像tag, html一样直接定义在tag对象中
            ....//any other attributes
        },
        items:[new Tag("div"), {tag:'div'},"hello"]//子元素数组, 数组元素可以是一个Tag对象或一个Tag对象的配置对象或一个普通字符串、
  })
  tag.toHtml(); //打印结果就知道是什么了
  tag.attr("attrName"); //打印结果就知道是什么了
  tag.$();//获取标签对应的dom对象,控制台打印出结果就知道是什么了,比如,console.log(tag.$())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值