`
JavaSam
  • 浏览: 935925 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义 javascript 通用函数 学习用

阅读更多
 
var reg = {
	"html" : /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/ //匹配html代码
};
var allFinded = [];
/**
 * @author wsf
 * 检测浏览器版本
 */
var browser = {
    "explorer": {
        "ie": /msie ([\d.]+).*\.net clr (\d\.){1,2}\d+\)$/,
        "firefox": /firefox\/([\d.]+)/,
        "chrome": /chrome\/([\d.]+)/,
        "opera": /opera.([\d.]+)/,
        "safari": /version\/([\d.]+).*safari/,
		"se" : /msie ([\d.]+).*\.net clr (\d\.){1,2}\d+; 360se\)$/,//360浏览器
		"sougou" : /msie ([\d.]+).*\.net clr (\d\.){1,2}\d+; .*metasr.*\d\)$/,//搜狗浏览器
		"maxthon" : /maxthon\/([\d.]+)///遨游浏览器webkit
    }
};

/**
 * 常用js代码
 */
var oCommon = {
    /**
     * 改变本地对象的方法
     */
    base: function(){
        Array.prototype.indexOf = function(vValue){
            for (var i = this.length - 1; i >= 0; i--) {
                if (this[i] == vValue) {
                    return i;
                }
            }
            return -1;
        };
        Array.prototype.deleteIndex = function(index){
            var t = this.slice(index, index + 1);
            this.splice(index, 1);
        };
        Array.prototype.deleteVal = function(val){
            var index = this.indexOf(val);
            this.deleteIndex(index);
        };
        
        
        /**
         * 判断浏览器代码
         */
        var userAgent = navigator.userAgent.toLowerCase();
        var expName = null;
        (expName = userAgent.match(browser.explorer.ie)) ? browser.ie = expName[1] :
		(expName = userAgent.match(browser.explorer.firefox)) ? browser.firefox = expName[1] :
		(expName = userAgent.match(browser.explorer.chrome)) ? browser.chrome = expName[1] : 
		(expName = userAgent.match(browser.explorer.opera)) ? browser.opera = expName[1] : 
		(expName = userAgent.match(browser.explorer.safari)) ? browser.safari = expName[1] : 
		(expName = userAgent.match(browser.explorer.se)) ? browser.se = expName[1] :
		(expName = userAgent.match(browser.explorer.sougou)) ? browser.sougou = expName[1] : 
		(expName = userAgent.match(browser.explorer.maxthon)) ? browser.maxthon = expName[1] :
		false;
		  
    },
    /**
     * 类选择器解决ie不支持document.getElementByClassName;
     * @param {Object} elem
     * @param {Object} selector
     */
    classSelect: function(elem, selector){
        var childNodes = elem.childNodes;
        var oClassEle = arguments[2] ? arguments[2] : [];
        for (var i = childNodes.length - 1; i >= 0; i--) {
			if(!childNodes[i].className)continue;
            if (childNodes[i].childNodes.length > 0) {
                oCommon.classSelect(childNodes[i], selector, oClassEle);
            }
            if (childNodes[i].className.indexOf(selector) != -1) {
                var thisClass = childNodes[i].className;
                var tmp = thisClass.split(/\s/);
                if (oCommon.inArray(selector, tmp)) {
                    oClassEle.push(childNodes[i]);
                }
            }
        }
        return oClassEle;
    },
    /**
     * 选择器
     */
    select: function(selector){
        var flag = selector.charAt(0);
        var reg = /[a-zA-Z]/;
        var selector = reg.test(flag) ? selector : selector.substring(1);
        switch (flag) {
            case null:
                return null;
                break;
            case "":
                return null;
                break;
            case ".":
                if (document.all) {
                    return oCommon.classSelect(document.body, selector);
                }
                else  if (document.getElementsByClassName) {
                        return document.getElementsByClassName(selector);
                }
                break;
            case "#":
                var eles = [];
                eles[0] = document.getElementById(selector);
                return eles;
                break;
            default:
			    if(arguments[1]) 
					return arguments[1].getElementsByTagName(selector);
                return document.getElementsByTagName(selector);
                break;
        }
    },
	/**
	 * 判断对象是否为空
	 * @param {Object} obj
	 */
	isEmptyObj : function(obj){
		for(var i in obj){
			return false;
		}
		return true;
	},
    inArray: function(val, oArray){
        for (var i = oArray.length - 1; i >= 0; i--) {
            if (oArray[i] === val) 
                return true;
        }
        return false;
    },
    /**
     * 兄弟节点
     */
    sibling: function(firstSibling, elem){
        var siblings = [];
        for (; firstSibling; firstSibling = firstSibling.nextSibling) 
            firstSibling.nodeType === 1 && firstSibling !== elem && siblings.push(firstSibling);
        return siblings
    },
    /**
     * 所有兄弟节点
     */
    siblings: function(elem){
        return oCommon.sibling(elem.parentNode.firstChild, elem);
    },
	next : function(ele){
		return ele.nextSibling;
	},
	prev : function(ele){
		return ele.previousSibling;
	},
	parent : function(ele){
		return ele.parentNode;
	},
	first : function(ele){
		return ele.firstChild;
	},
	last : function(ele){
		return ele.lastChild;
	},
	hasChild : function(ele){
		if(ele.childNodes){
			return (ele.childNodes).length > 0;
		}
	},
	find : function(ele,selector){
		var kids = ele.childNodes;
		for(var i in kids){
			var resultFinded = oCommon.children(kids[i],selector);
			var kid = kids[i];
			if(kid.nodeType !== 1) continue;
			if(resultFinded.length > 0) {
				for(var k in resultFinded){
					allFinded.push(resultFinded[i]);
				}
			}
			if(oCommon.hasChild(kid)){
				oCommon.find(kid,selector);
			}
		}
		return allFinded;
	},
    /**
     * 所有子节点或者指定子节点SSS
     */
    children: function(parent, selector){
        if (selector) {
            var kids = oCommon.sibling(parent.firstChild);
            var filterKids = oCommon.select(selector);
            var temp = [];
            for (var i = kids.length - 1; i >= 0; i--) {
                for (var j = filterKids.length; j >= 0; j--) {
                    if (kids[i] === filterKids[j]) 
                        temp.push(filterKids[j]);
                }
            }
            return temp;
        }
        else {
            return oCommon.sibling(parent.firstChild);
        }
    },
	child : function(parent,index){
		var kids = oCommon.children(parent);
		if (!(typeof index === "number")) {
			return null;
		}
		for(var i = kids.length - 1 ; i >= 0 ; i --){
			if(i === index - 1){
				return kids[i];
			}
		}
		return null;
	},
    /**
     * 所有父节点
     */
    parents: function(elem, selector){
        var parents = [];
        var parent = elem.parentNode;
        var filterParents = [];
        for (; parent; parent = parent.parentNode) {
            parent.nodeType === 1 && parents.push(parent);
        }
        if (selector) {
            filterParents = oCommon.select(selector);
            var temp = [];
            for (var i = parents.length - 1; i >= 0; i--) {
                for (var j = filterParents.length - 1; j >= 0; j--) {
                    if (parents[i] === filterParents[j]) {
                        temp.push(filterParents[j]);
                    }
                }
            }
            return temp;
        }
        return parents;
    },
	/**
	 * 动态改变样式信息
	 * @param {Object} oEle dom对象
	 * @param {Object} style 样式信息
	 */
    css: function(oEle){
        var args = arguments;
        var len = args.length;
        switch (len) {
            case 1:
                throw new Error("请填写样式信息!");
                break;
            case 2:
                var options = args[1];
                if (typeof options === "object") {
                    for (var key in options) {
                        eval("oEle.style." + key + " = \"" + options[key] + "\"");
                    }
                }else if(typeof options === "string"){
					return eval("oEle.style." + args[1]);
				}else{
					throw new Error("参数有误!");
				}
                break;
            case 3:
                eval("oEle.style." + args[1] + " = \"" + args[2] + "\"");
                break;
        }
    },
	html : function(ele,str){
		if(!ele){
			throw new Error("对象为空!");
		}
		if(!arguments[1] && "innerHTML" in ele ){
			return ele.innerHTML;
		}else{
			if("innerHTML" in ele){
				ele.innerHTML = str;
			}else{
				throw new Error("此元素不支持innerHTML属性!");
			}
		}
	},
	attribute : function(ele,attrName,attrVal){
		if(!attrVal){
			return ele.attrName;
		}else{
			ele.attrName = attrVal;
		}
	},
	/**
	 * 判断是否有样式
	 * @param {Object} oEle
	 * @param {Object} className
	 */
	hasClass : function(oEle , className){
		return oEle.className.match(new RegExp('(\\s|^)' +  className + '(\\s|$)'));
	},
	/**
	 * 添加样式信息
	 * @param {Object} oEle
	 * @param {Object} className
	 */
    addClass : function(oEle,className){
		if(! oCommon.hasClass(oEle,className)){
			oEle.className += " " + className;
		}
	},
    /**
     * 移除样式信息
     * @param {Object} oEle
     * @param {Object} className
     */
	removeClass : function(oEle , className){
		if(oCommon.hasClass(oEle,className)){
			var _thizClassName = oEle.className;
			_thizClassName = oCommon.trim( _thizClassName.replace(className,""));
			oEle.className = _thizClassName;
		}
	},
		/**
	 * 
	 * @param {Object} oEle
	 * @param {Object} className
	 */
	toggleClass : function(oEle , className){
		if(oCommon.hasClass(oEle,className)){
			oCommon.removeClass(oEle,className);
		}else {
			oCommon.addClass(oEle,className);
		}
	},
	/**
	 * 动画目前只支持 width height 
	 * @param {Object} id
	 */
	animate : function(ele){
        var elem = ele, f = j = 0, callback, _this = {}, tween = function(t, b, c, d){
            return -c * (t /= d) * (t - 2) + b
        }
        _this.execution = function(key, val, t){
            var s = (new Date()).getTime(), d = t || 500, b = parseInt(elem.style[key]) || 0, c = val - b, a = function(){
                var t = (new Date()).getTime() - s;
                if (t > d) {
                    t = d;
                    elem.style[key] = tween(t, b, c, d) + 'px';
                    j && callback && callback.apply(elem);
                    return true;
                }
                elem.style[key] = tween(t, b, c, d) + 'px';
                setTimeout(a, 10);
            }
            a();
        }
        _this.animate = function(sty, t, fn){
            callback = fn;
            for (var i in sty) {
                j++;
                _this.execution(i, parseInt(sty[i]), t);
            }
        }
        return _this;
	},
	visible : function(ele){
		return oCommon.css(ele,"display") !== "none";
	},
	/**
	 * @param {Object} ele
	 * @param {Object} speed
	 */
	slideDown : function(ele,speed){
        var h = oCommon.css(ele, "height");
		if(!oCommon.visible(ele)){
			oCommon.css(ele,"height","0.000001px");
			oCommon.css(ele,"display","block");
		}
        oCommon.animate(ele).animate({
            height: h
        }, speed, function(){
        });
	},
	/**
	 * @param {Object} ele
	 * @param {Object} speed
	 */
	slideUp : function(ele,speed){
        oCommon.animate(ele).animate({
            height: '0px'
        }, speed, function(){
			oCommon.css(ele,"display","none");
        });
	},
	/**
	 * @param {Object} ele
	 * @param {Object} speed
	 */
	slideToggle : function(ele,speed){
		if(oCommon.visible(ele)){
			oCommon.slideUp(ele,speed);
		}else{
			oCommon.slideDown(ele,speed);
		}
	},
	/**
	 * 去除前端空格
	 * @param {Object} str
	 */
	prevTrim : function(str){
		str = str.replace(/^\s+/,"");
		return str;
	},
	/**
	 * 去除后端空格
	 * @param {Object} str
	 */
	
	lastTrim : function(str){
		str = str.replace(/\s+$/,"");
		return str;
	},
	/**
	 * 去除两端、中间的所有空格
	 * @param {Object} str
	 */
	middleTrim : function(str){
		str = str.replace(/\s+/g,"");
        return str;		
	},
	/**
	 *去除两端空格
	 * @param {Object} str
	 */
	trim : function(str){
		str = oCommon.prevTrim(str);
		str = oCommon.lastTrim(str);
		return str;
	},
	/**
	 * 对象循环
	 */
	each : function(object,callback){
		if(object && typeof object === "object"){
			if(object instanceof Array && object.length === 0){
				return;
			}
			for(i in object){
				callback(i,object[i]);
			}
		}else{
			throw new Error("对象不知此此方法!");
		}
	},
	/**
	 * 生成tab
	 * @param {Object} target
	 * @param {Object} length
	 */
	createTab : function(tabOptions,target){
		return oCommon.private.createTab(tabOptions);
	},
    /**
     * ajax请求
     */
    ajax: function(options){
        var httpRequest = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
        httpRequest.onreadystatechange = function(){
            var dataType = options.dataType.toLowerCase();
            httpRequest.readyState === 4 && httpRequest.status === 200 && options.callback(dataType === "json" ? eval("(" + httpRequest.responseText + ")") : dataType === "xml" ? httpRequest.responseXML : httpRequest.responseText,options.context);
        };
        httpRequest.open(options.mode, options.url, options.sync);
        options.mode.toLowerCase() === "get" ? httpRequest.send(null) : httpRequest.send(options.params);
    },
	
    /**
     * 调用某方法的target
     */
    currentTarget: function(){
    	return false;
    },
	/**
	 * cookie的读写
	 */
	cookie : function(){
		this.flag = false;
		if(!this.flag){
			/**
			 * 利用正则表达式根据cookie名取得cookie值
			 * @param {Object} key
			 */
            oCommon.cookie.prototype.getCookie = function(key){
                var arr = document.cookie.match(new RegExp("(^|\s*)" + key + "=([^;]*)(;|$)"));
                return arr ? decodeURIComponent(arr[2]) : null;
            }
			/**
			 * 添加cookie
			 * @param {Object} name
			 * @param {Object} value
			 * @param {Object} expires 单位为分钟
			 * @param {Object} path
			 * @param {Object} domain
			 * @param {Object} secure
			 */
            oCommon.cookie.prototype.setCookie = function(name, value, expires, path, domain, secure){
				var date ;
				if(expires === 0){
					date = new Date(0);
					expires =  date.toUTCString() ;
				}else{
					if(expires && (typeof expires === "number")){
						date = new Date();
						date.setTime(date.getTime() + expires * 60 * 1000);
					}else{
						date = expires;
					}
					expires = expires ? date.toUTCString(): false;
				}
                document.cookie = name + "=" + encodeURIComponent(value) +
                ((expires) ? "; expires=" + expires : "") +
                ((path) ? "; path=" + path : "") +
                ((domain) ? "; domain=" + domain : "") +
                ((secure) ? "; secure" : "");
            }
			/**
			 * 删除cookie
			 * @param {Object} key
			 */
			oCommon.cookie.prototype.delCookie = function(key){
			   this.getCookie(key) ? document.cookie = key + "=;expires=Thu, 1 Jan 1970 00:00:00 UTC" : false;
			}
			/**
			 * 清空所有cookie信息
			 */
			oCommon.cookie.prototype.clearCookie = function(){
				var arr = document.cookie.split(";");
				for(i in arr){
					this.delCookie(arr[i].split("=")[0]);
				};
			}
			this.flag = true;
		}
	},
	/**
	 * 模拟Map
	 */
	Map : function(){
		this.flag = false;
		this.store = new Array();
		if(!this.flag){
			 oCommon.Map.prototype.structure = function(key,val){
					this.key = key;
					this.val = val;
			 }
			 oCommon.Map.prototype.put = function (key,val){
			 	for(var i = this.store.length - 1 ; i >= 0 ; i --){
					this.store[i].key === key && this.store[i].val === val ; 
				}
				this.store[this.store.length] = new this.structure(key,val);
			 }
			 oCommon.Map.prototype.get = function(key){
			 	for(var i = this.store.length - 1 ; i >= 0 ; i --){
					if(this.store[i].key === key) return this.store[i].val; 
				}
				return null;
			 }
			 oCommon.Map.prototype.remove = function(key){
			 	for(var i = this.store.length - 1 ; i >= 0 ; i --){
					this.store[i].key === key && this.store.splice(i,1);
				}
			 }
			 oCommon.Map.prototype.keySet = function(){
			 	var keys = new Array();
			 	for(var i = 0 ; i <= this.store.length - 1 ; i ++){
					keys.push(this.store[i].key);
				}
				return keys;
			 }
			 oCommon.Map.prototype.valSet = function(){
			 	var vals = new Array();
			 	for(var i = 0 ; i <= this.store.length - 1 ; i ++){
					vals.push(this.store[i].val);
				}
				return vals;
			 }
			 oCommon.Map.prototype.clear = function(){
			 	this.store.length = 0;
			 }
			 oCommon.Map.prototype.size = function(){
			 	return this.store.length;
			 }
		}
	},
	/**
	 * 模拟StringBuilder
	 */
	StringBuilder : function(){
		this.vStrings = new Array();
		this.flag = false;
		if(!this.flag){
			oCommon.StringBuilder.prototype.append = function(str){
				this.vStrings.push(str);
			}
			oCommon.StringBuilder.prototype.toString = function(){
				return this.vStrings.join("");
			}
			oCommon.StringBuilder.prototype.charAt = function(index){
				return this.toString().charAt(index);
			}
			oCommon.StringBuilder.prototype.clear = function(){
				this.vStrings.length = 0;
			}
			oCommon.StringBuilder.prototype.Delete = function (start,end){
				var tempString = this.toString();
				var prevString = tempString.substring(0,start);
				var nextString = end ?  tempString.substring(end) : tempString.substring(start+1);
				this.clear();
				this.append(prevString);
				this.append(nextString);
			}
			oCommon.StringBuilder.prototype.length = function(){
				return this.toString().length;
			}
		    oCommon.StringBuilder.prototype.substring = function(start,end){
				return this.toString().substring(start,end);
			}
			oCommon.StringBuilder.prototype.replace = function(oldStr,newStr){
				var newStr = newStr ? newStr : "";
				var tempString =  this.toString().replace(new RegExp(oldStr,"g"),newStr);
				this.clear();
				this.append(tempString);
			}
			oCommon.StringBuilder.prototype.indexOf = function (val){
				return this.toString().indexOf(val);
			}
			oCommon.StringBuilder.prototype.lastIndexOf = function(val){
				return this.toString().lastIndexOf(val);
			}
			oCommon.StringBuilder.prototype.insert = function (offset,str){
				var prevString = this.substring(0,offset);
				var middleString = str;
				var nextString = this.substring(offset);
				this.clear();
				this.append(prevString);
				this.append(middleString);
				this.append(nextString);
			}
			this.flag = true;
		}
	}
}
 
0
0
分享到:
评论

相关推荐

    [hook.js]通用Javascript函数钩子

    //自定义对象匿名函数 function Person() { this.getName = function(name) { alert('Call' + name); } } var p = new Person(); var _p_getName = null; function mygetName(name){alert("Hooked");} p.getName....

    javascript自定义函数参数传递为字符串格式

    自定义函数参数传递为 字符串格式 ,传递方式 1:用this传递 2:引号缺省 3:转义字符(html中 代表”双引号,'代表单引号,javascript中直接\” 和Java通用转义字符集) &lt;html&gt; &lt;head&gt; [removed] ...

    javascript 添加和移除函数的通用方法

    javascript 添加和移除函数的通用方法, 需要的朋友可以参考下。

    构造函数+原型模式构造js自定义对象(最通用)

    [removed] /* * 组合模式: 构造函数模式+原型模式 这种方式是javascript中最通用的创建对象的方式 变量类型属性:用构造函数传递 函数类型属性:用原型模式声明 */ function Student(name,age){ this.name=name;...

    JavaScript王者归来part.1 总数2

     1.7 学习和使用JavaScript的几点建议   1.8 关于本书的其余部分   第2章 浏览器中的JavaScript  2.1 嵌入网页的可执行内容   2.2 赏心悦目的特效   2.3 使用JavaScript来与用户交互  2.4 绕开脚本陷阱 ...

    outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具

    支持配置自定义工具栏按钮和按钮的回调函数; 支持针对(github 项目的)API 文档的 tags 和 issues 等按钮的跳转; 支持自定义图标的自定义按钮,并且支持配置自定义按钮的触发事件和事件处理器; 自动为文章页面...

    jslib:通用 Javascript 类的集合

    jslib jslib 是一组通用的 Javascript 类。 他们不依赖于任何特定的项目并且做非常基本的事情。自动画布.js 构建一个自动调整大小的全屏 HTML 画布。Contemplate.js 超轻量级的 HTML5 模板系统。 支持子模板化。 ...

    php课程(共100多节)

    7:PHP函数和自定义函数 8:Mysql 简介和创建新的数据库 9:数据库中的常用SQL语句 10:MYSQL在PHP5中的应用 11:学习制作PHP+MYSQL留言板(上) 12:学习制作PHP+MYSQL留言板(下) 13:PHP+MYSQL分页原理 14:PHP...

    JSUS:JavaScript实用程序。 通用功能的集合。 JSUS助您一臂之力!

    通用javascript函数的集合。 JSUS助您一臂之力! 图书馆 OBJ 大批 时间 评估 DOM 随机的 帕斯 FS 兼容性 队列 浏览器 在浏览器中,将导出两个对象: JSUS及其简写J 建造 使用bin目录中的make文件创建JSUS.js的...

    107个常用javascript语句

    47.当在超链接中调用JS函数时用:(javascript :)来开头后面加函数名 48.在老的浏览器中不执行此JS:&lt;!-- //--&gt; 49.引用一个文件式的JS:&lt;script type="text/javascript" src="aaa.js"&gt; 50.指定在不支持脚本的浏览器显示...

    lazy-umd:从名称,默认值和依赖项列表生成UMD模块的函数以及一个函数

    这是一个javascript通用模块定义包装器。 它允许您仅指定三个简单的内容,并自动获得一个包装好的模块,该模块可以在浏览器中使用,也可以与所有requirejs一起使用,同时保持使用自定义版本或别名版本覆盖依赖项的...

    前端面试宝典V3.0.docx

    13、通用事件绑定/ 编写一个通用的事件监听函数?(必会) 110 14、dom 和 bom 的区别(必会) 111 15、事件三要素(必会) 111 16、事件执行过程(必会) 111 17、获取元素位置(必会) 112 18、封装运动函数(必会...

    generic-midi-controller:通用接口,用于处理不同的MIDI控制器输入输出设备

    使用input和output功能可自定义输入/输出处理:input 一个对象,其中每个属性都包含一组函数,这些函数用于确定在接收MIDI输入消息时的更新值。 可选的。 const controller = GenericMIDI ( { buttons : [ msg =&gt; ...

    asp.net知识库

    自定义通用System.Web.UI.IHierarchicalDataSource简单实现 在 ASP.NET 2.0 中创建 Web 应用程序主题 ASP.NET 2.0 中的数据访问 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格控件了! 将 ASP.NET 2.0 应用程序服务...

    python入门到高级全栈工程师培训 第3期 附课件代码

    03 高阶函数使用 04 函数闭包 05 函数闭包装饰器基本实现 06 函数闭包加上返回值 07 函数闭包加上参数 08 函数闭包补充:解压序列 09 函数闭包为函数加上认证功能 10 函数闭包模拟session 11 函数闭包装饰器运行流程...

    PHP100视频教程全集112集BT种子【PHP经典】

    PHP100视频教程7:PHP函数和自定义函数 PHP100视频教程8:Mysql 简介和创建新的数据库 PHP100视频教程9:数据库中的常用SQL语句 PHP100视频教程10:MYSQL在PHP5中的应用 PHP100视频教程11:学习制作PHP+MYSQL...

    flex3的cookbook书籍完整版dpf(包含目录)

    20.4节在JavaScript中调用ActionScript方法函数 20.5节经由BrowserManager改变HTML页面标题 20.6节BrowserManager解析URL 20.7节经由BrowserManager深度-链接到数据 20.8节经由BrowserManager深度-链接容器 20.9节...

    ASP.NET 控件的使用

    3.1.1 验证控件与JavaScript 85 3.1.2 使用Page.IsValid 85 3.1.3 设置Display属性 86 3.1.4 突出显示验证错误 86 3.1.5 使用验证组 90 3.1.6 禁用验证 93 3.2 使用RequiredFieldValidator控件 94 3.3 使用...

    ASP.NET基础控件-教程

     调用存储过程通用类DBHelper  加密解密  SQL常用DBHelper  Asp.net存储过程无限分类  TreeView无限分类  无限分类MVC  荧光棒效果获取控件上全选  回车转换成Tab  DataGrid超级连接列  DataGrid行随鼠标...

Global site tag (gtag.js) - Google Analytics