TQuery

我的仿jq库

Skrip ini tidak untuk dipasang secara langsung. Ini adalah pustaka skrip lain untuk disertakan dengan direktif meta // @require https://update.greasyfork.org/scripts/11045/1483264/TQuery.js

;(function(win, doc, undefined) {
	var $ = (function() {
		//构造函数
		var TQuery = function(selectors){
			return TQuery.fn.init(selectors);
		};
		var vision = 1.02;
		TQuery.fn = TQuery.prototype = {
			"constructor": TQuery,
			"TQuery": vision,
			//初始化
			"init": function(selectors) {
				this.selectors = selectors;
				var eles = []; //所有选择的元素
				switch (typeof selectors) {
					case "undefined":
						return this;
					case "function":
						this.ready(function(e){
							selectors.call(this, e);
						});
						break;
					case "string":
						switch (selectors.charAt(0)) {
							case '<': //<div></div>,创建元素
								var oDiv = doc.createElement('div'); //创建一个容器
								var oFragment = doc.createDocumentFragment(); //创建文档碎片
								oDiv.innerHTML = selectors;
								var child = oDiv.childNodes;
								//储存在文档碎片中
								for (var t = 0; t < child.length; t++) {
									var clone = child[t].cloneNode(true);
									oFragment.appendChild(clone);
								}
								//输出到对象中
								var temp = [];
								for (var i = 0; i < oFragment.childNodes.length; i++) {
									temp.push(oFragment.childNodes[i]);
								}
								eles = temp;
								break;
							default: //默认情况下是选择符
								//现代浏览器,IE8+,chrome,firefox,safari,opera
								if (doc.querySelectorAll) { 
									var aElems = doc.querySelectorAll(selectors);
									for (var o = 0; o < aElems.length; o++) {
										eles.push(aElems[o]);
									}
								}
								//IE8以下
								else{
									console.log('您的浏览器不支持TQuery');
								}
						}
						break;
					case "object":
						// //数组
						// if (TQuery.isArray(selectors)) {
						// 	$ARR(selectors);
						// }
						//DOM
						// else if (TQuery.isDOM(selectors)) {
							eles.push(selectors);
						// }
						//普通对象,IE8下,一切皆为对象
						// else {
							
						// 	$OBJ(selectors);
						// }
						break;
					default:
						return this;
				}
				this.refresh(eles);
				return this;
			},
			//重拾新的对象
			"reinit":function(selectors){
				return this.init(selectors);
			},
			//刷新对象数据
			"refresh": function(newArray) {
				//清空
				for (var j = 0; j < this.length; j++) {
					delete this[j];
				}
				if (newArray) this.init.elements = newArray;
				this.length = this.init.elements.length;
				//生成
				for (var i = 0; i < this.init.elements.length; i++) {
					this[i] = this.init.elements[i];
				}
			},
			//==============选择器=============
			"eq": function(n) {
				var m = n || 0,
					newArray = [];
				newArray[0] = this[m];
				this.refresh(newArray);
				return this;
			},
			//CSS3:nth-child
			"nth":function(selectors){
				var s = this.selectors.split(",");//'input,ul li'
				for( var i=0;i<s.length;i++ ){
					s[i] += ':nth-child(' + selectors + ')';
				}
				return this.reinit(s.join(","));
			},
			//倍数选择器
			"an":function(n){
				n = n ? n : 1;
				this.nth(n + 'n');
			},
			//奇数,2n-1
			"odd":function(){
				return this.nth('odd');
			},
			//偶数,2n
			"even":function(){
				return this.nth('even');
			},
			"first": function() {
				var s = this.selectors.split(",");//'input,ul li'
				for( var i=0;i<s.length;i++ ){
					s[i] += ':first-child';
				}
				return this.reinit( s.join(",") );
			},
			//选择倒数第几个,默认为0
			"last":function(n){
				n = n ? n : 1;
				var s = this.selectors.split(",");//'input,ul li'
				for( var i=0;i<s.length;i++ ){
					s[i] += ':nth-last-child(' + n + ')';
				}
				return this.reinit( s.join(",") );
			},
			"not": function(selectors) {//过滤掉
				var childElements = [];
				for (var i = 0; i < this.length; i++) {
					switch (selectors.charAt(0)) {
						case '#': //id
							if (this[i].id != selectors.substring(1)) {
								childElements.push(this[i]);
							}
							break;
						case '.': //class
							if (!this.hasClass(this[i], selectors.substring(1))) { //没有匹配到class
								childElements.push(this[i]);
							}
							break;
						default: //tagName
							if (this[i].tagName != selectors.toUpperCase()) {
								childElements.push(this[i]);
							}
					}
				}
				this.refresh(childElements);
				return this;
			},
			"filter": function(selectors) {//筛选
				var childElements = [];
				for (var i = 0; i < this.length; i++) {
					var ele = this[i];
					switch (selectors.charAt(0)) {
						case '#':
							if (this[i].id == selectors.substring(1)) {
								childElements.push(ele);
							}
							break;
						case '.':
							if (this.hasClass(ele, selectors.substring(1))) { //如果有class
								childElements.push(ele);
							}
							break;
						case '[':
							var attrinfo = selectors.replace(/(\[+|\]+|\"|\"+])/g, '').split('=');
							var attr = attrinfo[0];
							var value = attrinfo[1];
							if (attrinfo.length === 1) { //只过滤属性,没有值
								if (ele[attr] !== null || ele.getAttribute(attr)) {
									childElements.push(ele);
								}
							} else if (attrinfo.length == 2) { //过滤属性值
								if (ele[attr] == value || ele.getAttribute(attr) == value) {
									childElements.push(ele);
								}
							}
							break;
						default:
							if (ele.tagName == selectors.toUpperCase()) {
								childElements.push(ele);
							}
					}
				}
				this.refresh(childElements);
				return this;
			},
			"find": function(selectors) {//查找子节点
				var childElements = [];
				for (var i = 0; i < this.length; i++) {
					var aElems = this[i].querySelectorAll(selectors);
					var length = aElems.length;
					var j = 0;
					while (j < length) {
						childElements.push(aElems[j]);
						j++;
					}
				}
				this.refresh(childElements);
				return this;
			},
			"add": function(selectors) {
				var newSelectors = this.selectors + ',' + selectors;
				var newElements = doc.querySelectorAll(newSelectors);
				this.refresh(newElements);
				return this;
			},
			"slice": function(n, m) {
				if (n < 0 || m > this.length) return;
				var newArray = this.init.elements.slice(n, m + 1);
				this.refresh(newArray);
				return this;
			},
			//还原最初状态
			"end": function() {
				var newArray = doc.querySelectorAll(this.selectors);
				this.refresh(newArray);
				return this;
			},
			//是否包含元素
			"has": function(selectors) {
				var newArray = [];
				for (var i = 0; i < this.length; i++) {
					if (this[i].querySelectorAll(selectors).length > 0) {
						newArray.push(this[i]);
					}
				}
				this.refresh(newArray);
				return this;
			},
			//可见
			"visible":function(){

			},
			//不可见
			"unvisible":function(){

			},
			//在可视区域内的
			"inViewPort": function() {
				this.inViewPort.get = function(jugg) {
					var visi = [],
						unvisi = [],
						w, h, pos, inViewPort;
					for (var i = 0; i < this.length; i++) {
						pos = this[i].getBoundingClientRect();
						w = doc.documentElement.clientWidth || doc.body.clientWidth;
						h = doc.documentElement.clientHeight || doc.body.clientHeight;
						inViewPort = pos.top > h || pos.bottom < 0 || pos.left > w || pos.right < 0;
						if (inViewPort === true) { //不在可视区域
							unvisi.push(this[i]);
						} else { //在可视区域
							visi.push(this[i]);
						}
					}
					return jugg === true ? visi : unvisi;
				};
				var newArray = this.inViewPort.get.call(this, true);
				this.refresh(newArray);
				return this;
			},
			//不在可视区域内
			"outViewPort": function() {
				var newArray = this.inViewPort.get.call(this, false);
				this.refresh(newArray);
				return this;
			},
			//==============遍历=============
			"each": function(fn) {
				for (var i = 0; i < this.length; i++) {
					fn.call(this[i]);
				}
				return this;
			},
			"findParent": function(selectors) {
				var parent = this[0].parentNode;
				if (parent.className.match(/result/)) { //找到结果
					var newArray = [];
					newArray[0] = parent;
					this.refresh(newArray);
					return this;
				} else if (parent == doc.documentElement || parent == doc.body) { //到达DOM顶层
					return this;
				} else { //继续查找
					this.findParent(selectors);
				}
			},
			"parent": function() {
				var newArray = [];
				newArray[0] = this[0].parentNode;
				this.refresh(newArray);
				return this;
			},
			"parents": function() {
				var newArray = []; //存储所有的父节点
				var hash = {};
				for (var i = 0; i < this.length; i++) {
					var v = this[i].parentNode;
					if (typeof(hash[v]) == 'undefined') {
						hash[v] = 1;
						newArray.push(v);
					}
				}
				this.refresh(newArray);
				return this;
			},
			"children": function() {
				var childElements = []; //存放所有的子节点
				var hash = {}; //过滤已经重复的子节点,中转站
				for (var i = 0; i < this.length; i++) {
					if (this[i].hasChildNodes() === false) {
						continue;
					}
					for (var j = 0; j < this[i].children.length; j++) {
						childElements.push(this[i].children[j]);
					}
				}
				var newArray = TQuery.unique(childElements);
				this.refresh(newArray);
				return this;
			},
			"prev": function() {
				var temps = [];
				for (var i = 0; i < this.length; i++) {
					var ele = this[i];
					if ($(ele).index() === 0) { //如果处在第一位,没有上一个兄弟节点
						continue;
					}
					temps.push(ele.parentNode.children[$(ele).index() - 1]);
				}
				this.refresh(temps);
				return this;
			},
			"prevAll": function() {
				var prevAllElements = [];
				for (var i = 0; i < this.length; i++) {

				}
				return this;
			},
			"next": function() {
				var temps = [];
				for (var i = 0; i < this.length; i++) {
					var ele = this[i];
					if ($(ele).index() == ele.parentNode.children.length - 1) { //如果处最后一位,没有下一个兄弟节点
						continue;
					}
					temps.push(ele.parentNode.children[$(ele).index() + 1]);
				}
				this.refresh(temps);
				return this;
			},
			"nextAll": function() {
				return this;
			},
			"siblings": function(selectors) {
				var temps = [];
				var parentNode = this.parents().elements;
				var parentNodeLength = parentNode.length;
				var allChild;
				for (var i = 0; i < parentNodeLength; i++) {
					allChild = parentNode[i].children; //所有同胞元素集合
					for (var j = 0; j < allChild.length; j++) {
						temps.push(allChild[j]); //获取所有同胞元素,包括自身
					}
				}
				this.refresh(temps);
				//如果有参数传入,则过滤同胞元素
				if (selectors) {
					this.not(selectors);
				}
				return this;
			},
			//==============事件=============
			"ready": function(fn) {
				if (this[0] == win) this[0] = doc;
				this.reinit(doc).bind('DOMContentLoaded', function(e) {
					fn.call(this, e);
					this.ready = "complete";
					// $(this).unbind('DOMContentLoaded',"ready");
				});
				//如果不支持DOMContentLoaded(IE8及以下不支持),
				if( !TQuery.browser.msie() || TQuery.browser().visoin>8 ) return this;
				if( typeof this[0].ready == "undefined" ||this[0].ready!=="complete" ){
					if( typeof this[0].onreadystatechange !== "undefined" ){
						this.bind('readystatechange',function(e){
							if(this.readyState == 'complete'){
								fn.call(this, e);
								this.ready = "complete";
								$(this).unbind('readystatechange',"ready");
								return false;
							}
						},"ready");
					}
					// 不支持document.onreadystatechange
					else{
						(function(){
						    try{
						        //doScroll方法只有在dom ready之后可以调用,否则会抛异常
						        doc.documentElement.doScroll('left');
						    }catch(e){
						    win.setTimeout( arguments.callee, 0 );
						    return;
						    }
						    //这里触发DOMContentLoaded事件
						    fn.call(doc);
						    doc.ready = "complete";
						})();
					}					
				}
				return this;
			},
			"load": function(fn) {
				if (this[0] == doc) this[0] = win;
				this.bind('load', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				},'load');
				return this;
			},
			"unload":function(fn){
				this.reinit(win).bind('unload',function(e){
					fn.call(this,e);
					return stop.call(e);
				},"unload");
			},
			"isreload":function(message){
				this.reinit(win).bind('beforeunload',function(e){
					e.returnValue = message;
					return message;
				},'beforeunload');
			},
			"click": function(fn) {
				this.bind('click', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"keydown": function(fn) {
				this.bind('keydown', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"keyup": function(fn) {
				this.bind('keyup', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"keypress": function(fn) {
				this.bind('keypress', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"mousedown": function(fn) {
				this.bind('mousedown', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"mouseup": function(fn) {
				this.bind('mouseup', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"mouseenter": function(fn) {
				this.bind("mouseover", function(e) {
					if (e.target == this) {
						fn.call(this, e);
					}
					return stop.call(e); //默认禁止冒泡
				});
				return this;
			},
			"mouseleave": function(fn) {
				this.bind("mouseout", function(e) {
					if (e.target == this) {
						fn.call(this, e);
					}
					return stop.call(e); //默认禁止冒泡
				});
				return this;
			},
			"mousemove": function(fn) {
				this.bind("mousemove", function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"mouseover": function(fn) {
				this.bind("mouseover", function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"mouseout": function(fn) {
				this.bind("mouseout", function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"on": function(type, fn) {
				var ev = null;
				//如果只传一个json参数
				if (arguments.length == 1) {
					for (var k = 0; k < this.length; k++) {
						for (var attr in type) {
							// this[k][ 'on'+attr ] = type[attr];
							this[k]['on' + attr] = function(e) {
								ev = win.event ? win.event : (e ? e : null);
								if (type[attr].call(this, ev) === false) {
									return stop.call(e);
								}
							};
						}
					}
				}
				//如果传两个参数type,fn
				else {
					var events = type.split(' '); //获取每个事件
					var eventsLength = events.length;
					for (var i = 0; i < this.length; i++) {
						var j = 0;
						while (j < eventsLength) {
							// this[i][ 'on'+events[j] ] = fn;
							this[i]['on' + events[j]] = function(e) {
								ev = win.event ? win.event : (e ? e : null);
								if (fn.call(this, ev) === false) {
									ev.stopPropagation(); //阻止冒泡,w3c标准
									ev.cancelBubble = true; //阻止冒泡,ie,firefox
									ev.preventDefault(); //w3c标准
									ev.returnValue = false; //阻止默认事件,针对老版本IE
									return false;
								}
							};
							j++;
						}
					}
				}
				return this;
			},
			"hover": function(mouseenter, mouseleave) {
				this.mouseenter(function(e) {
					mouseenter.call(this, e);
				});
				this.mouseleave(function(e) {
					mouseleave.call(this, e);
				});
				return this;
			},
			"toggleClick": function() {
				var _this = this,
					_arguments = arguments,
					data = this.data('toggleClick'); //获取属性
				if (typeof data.count == "undefined") data.count = 0;
				if (typeof data.fns == "undefined") data.fns = arguments.length;
				this.data('toggleClick', data); //设置属性
				for (var i = 0; i < this.length; i++) {
					this.bind('click', function() {
						_arguments[data.count++ % data.fns].call(_this[i]);
						return stop.call(e);; //默认禁止冒泡
					}, 'toggleClick');
				}
				return this;
			},
			"resize":function(fn){
				this.bind('resize',function(e){
					if( fn.call(this,e) === false){
						return stop.call(e);
					}
				});
			},
			"scroll": function(fn) {
				this.bind('scroll', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				});
				return this;
			},
			"mouseScroll": function(fn) {
				this.bind('mousewheel DOMMouseScroll', function(e) {
					if (fn.call(this, e) === false) {
						return stop.call(e);
					}
				},'mouseScroll');
				return this;
			},
			"mouseScrollUp": function(fn) {
				this.bind('mousewheel DOMMouseScroll', function(e) {
					if (e.wheelDelta) { //chrome,ie
						if (e.wheelDelta > 0) { //滚轮向上滚动
							if (fn.call(this, e) === false) {
								return stop.call(e);
							}
						}
					} else { //狗日的firefox
						if (e.detail < 0) { //滚轮向上滚动
							if (fn.call(this, e) === false) {
								return stop.call(e);
							}
						}
					}
				}, "mouseScrollUp");
				return this;
			},
			"mouseScrollDown": function(fn) {
				this.bind('mousewheel DOMMouseScroll', function(e) {
					if (e.wheelDelta) { //chrome,ie
						if (e.wheelDelta < 0) { //滚轮向下滚动
							if (fn.call(this, e) === false) {
								return stop.call(e);
							}
						}
					} else { //狗日的firefox
						if (e.detail > 0) { //滚轮向下滚动
							if (fn.call(this, e) === false) {
								return stop.call(e);
							}
						}
					}
				}, "mouseScrollDown");
				return this;
			},
			"bind": function(type, fn, fnName) {
				//如果只传一个json参数
				if (arguments.length == 1) {
					for (var k = 0; k < this.length; k++) {
						for (var attr in type) {
							bindEvent(this[k], attr, type[attr], fnName);
						}
					}
				}
				//如果传两个参数,则多个事件统一执行一个e
				else {
					var events = type.split(' ');
					for (var i = 0; i < this.length; i++) {
						var j = 0;
						while (j < events.length) {
							bindEvent.call(this[i], this[i], events[j], fn, fnName);
							j++;
						}
					}
				}

				function bindEvent(dom, type, fn, fnName) {
					dom.eventQueue = dom.eventQueue || {};
					dom.eventQueue[type] = dom.eventQueue[type] || {};
					dom.handler = dom.handler || {};
					var index = 0; //事件队列长度
					for (var length in dom.eventQueue[type]) {
						index++;
					}
					if (!fnName) {
						dom.eventQueue[type]['fn' + index] = fn;
					} else {
						dom.eventQueue[type][fnName] = fn;
						// this.fnName = fnName;
					}
					//如果不存在handler[click],handler[mouseover],…………
					if (!dom.handler[type]) {
						dom.handler[type] = function(e) {
							ev = win.event ? win.event : (e ? e : null);
							ev.target = ev.target || ev.srcElement;
							for (var fn in dom.eventQueue[type]) {
								if (dom.eventQueue[type][fn].call(this, ev) === false) {
									return stop.call(ev);
								}
							}
						};
						addEvent(dom, type, dom.handler[type]);
					}
				}
				return this;
			},
			"unbind": function(type, fnName) {
				for (var m = 0; m < this.length; m++) {
					var dom = this[m];
					var hasQueue = dom.eventQueue && dom.eventQueue[type];
					var queueLength = 0;
					for (var length in dom.eventQueue[type]) {
						queueLength++;
					}
					//没有绑定
					if (!hasQueue) return;
					if (!fnName) { //解除匿名函数
						if (win.removeEventListener) {
							dom.removeEventListener(type, dom.handler[type]);
						} else {
							dom.detachEvent(type, dom.handler[type]);
						}
						delete dom.eventQueue[type];
					}
					else { //解除有名函数
						delete dom.eventQueue[type][fnName];
						//如果没有队列了,则删除队列。
						if (queueLength === 0) {
							if (win.removeEventListener) {
								dom.removeEventListener(type, dom.handler[type]);
							} else {
								dom.detachEvent(type, dom.handler[type]);
							}
							delete dom.eventQueue[type];
						}
					}
				}
			},
			"one": function(type, fn) {
				var _this = this;
				//只穿一个json参数
				if (arguments.length == 1) {
					for (var k = 0; k < this.length; k++) {
						for (var attr in type) {
							// bindEvent(this[k],attr,type[attr],fnName);
							this.bind(attr, function(e) {
								var ev = win.event ? win.event : (e ? e : null);
								_this.unbind(ev.type, 'one');
								if (type[attr].call(this, ev) === false) {
									return stop.call(e);
								}
							}, "one");
						}
					}
				}
				//传2个参数
				else {
					var events = type.split(' '); //获取每个事件
					var eventsLength = events.length;
					for (var i = 0; i < this.length; i++) {
						var j = 0;
						while (j < eventsLength) {
							// this[i][ 'on'+events[j] ] = fn;
							this.bind(events[j], function(e) {
								var ev = win.event ? win.event : (e ? e : null);
								_this.unbind(ev.type, 'one');
								if (fn.call(this, ev) === false) {
									return stop.call(e);
								}
							}, "one");
							j++;
						}
					}
				}
				return this;
			},
			"trigger": function(type, fnName) {
				for (var k = 0; k < this.length; k++) {
					var dom = this[k];
					if (!fnName) {
						//如果是自定义事件
						if ( TQuery.isUndefined(dom["on" + type]) || TQuery.isUndefined(dom[type]) ) {
							//触发DOM2级事件,通过bind绑定的。
							if (dom.eventQueue) {
								for (var fn in dom.eventQueue[type]) {
									dom.eventQueue[type][fn].call(dom);
								}
							}
						}
						//如果是DOM原生事件
						else {
							// 触发DOM0,DOM2级事件,不通过bind绑定的
							if (typeof dom[type] !== "undefined") {
								dom[type].call(dom);
							}
						}
					}
					//指定触发哪个函数
					else {
						dom.eventQueue[type][fnName].call(dom);
					}
				}
				return this;
			},
			"triggerHandler":function(type, fnName){
				this.trigger(type, fnName);
			},
			"live": function(type, fn, parent) {
				var _this = this,
					liveIndex = "live" + parseFloat(Math.random() * 10).toFixed(10).replace('.', "");
				parent = parent ? parent : doc;
				for (var j = 0; j < this.length; j++) {
					this[j].parentLive = parent;
					this[j].liveIndex = liveIndex;
				}
				$(parent).bind(type, function(e) {
					for (var i = 0; i < _this.length; i++) {
						if (e.target == _this[i]) {
							fn.call(e.target, e);
							break;
						}
					}
					return stop.call(e);//默认阻止冒泡
				}, liveIndex);
				return this;
			},
			"die": function(type, parent) {
				var liveIndex = this[0].liveIndex;
				parent = parent ? parent : (this[0].parentLive ? this[0].parentLive : doc);
				$(parent).unbind(type, liveIndex);
			},
			"mutation": function(options, fn) {
				var MutationObserver, observer;
				for (var i = 0; i < this.length; i++) {
					MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver;
					observer = new MutationObserver(function(mutations) {
						mutations.forEach(function(mutation) {
							fn.call(this[i]);
						});
					});
					observer.observe(this[i], options);
				}
				return this;
			},
			//支持的标签<input type="text">, <select>, <textarea>,js对象:fileUpload, select, text, textarea
			"change":function(fn){
				this.bind('change',function(e){
					fn.call(this,e);
				});
			},
			//==============尺寸=============
			"width": function(setting) {
				if (!setting && this[0] instanceof Object && (this[0].alert || this[0].body)) { //如果是win,或document
					return doc.body.scrollWidth > doc.documentElement.scrollWidth ? doc.body.scrollWidth : doc.documentElement.scrollWidth; //获取带padding和margin的值
				} else if (setting) { //设置宽度
					for (var i = 0; i < this.length; i++) {
						this[i].style.width = setting.toString().replace('px', '') + 'px';
					}
					return this;
				} else {
					return this[0].offsetWidth || parseFloat(this.style('width')); //获取宽度
				}
			},
			"height": function(setting) {
				if (this[0] instanceof Object && (this[0].alert || this[0].body)) { //如果是win,或document,则返回整个文档高度
					return doc.body.scrollHeight > doc.documentElement.scrollHeight ? doc.body.clientHeight : doc.documentElement.scrollHeight; //获取带padding和margin的值
				} else if (setting) { //设置高度
					for (var i = 0; i < this.length; i++) {
						this[i].style.height = setting.toString().replace('px', '') + 'px';
					}
					return this;
				} else if (!setting) {
					return this[0].offsetHeight || parseFloat(this.style('height')); //获取高度
				}
			},
			"innerWidth": function() {

			},
			"innerHeight": function() {

			},
			"top": function(setting) {
				if (setting) {
					this.css('top', setting);
					return this;
				}
				return parseInt(this[0].offsetTop);
			},
			"left": function(setting) {
				if (setting) {
					this.css('left', setting);
					return this; //返回对象,进行链式操作
				}
				return parseInt(this[0].offsetLeft);
			},
			"viewWidth": function() {
				return doc.body.clientWidth < doc.documentElement.clientWidth ? doc.body.clientWidth : doc.documentElement.clientWidth; //取较小值
			},
			"viewHeight": function() {
				return doc.body.clientHeight < doc.documentElement.clientHeight ? doc.body.clientHeight : doc.documentElement.clientHeight; //取较小值
			},
			"style": function(attr) {
				return this[0].currentStyle ? this[0].currentStyle[attr] : getComputedStyle(this[0])[attr];
			},
			"scrollTop": function() {
				return this.size('scrollTop');
			},
			"scrollHeight": function() {
				return this.size('scrollHeight');
			},
			"scrollLeft": function() {
				return this.size('scrollLeft');
			},
			"scrollWidth": function() {
				return this.size('scrollLeft');
			},
			"size": function(attr) {
				return doc.documentElement[attr] ? doc.documentElement[attr] : doc.body[attr];
			},
			//包含margin
			"offset": function(attr) {
				return this[0]['offset' + TQuery.upper(attr)];
			},
			//==============属性=============
			//可编辑性,true>>>可编辑,false>>>不可编辑
			"modify":function(boolean){
				boolean = (typeof boolean !== "undefined") ? boolean : true;
				this.prop({
					"contentEditable":boolean,
					"readOnly":!boolean
				});
				return this;
			},
			//一个是特性
			"prop": function(prop, value) {
				if (arguments.length == 1) {
					//读取
					if (typeof prop == "string") {
						return this[0][prop];
					}
					//写,json格式
					else {
						for (var key in prop) {
							for( var j=0;j<this.length;j++ ){
								if( typeof this[j][key] !=="undefined" ){
									this[j][key] = prop[key];
								}
							}
						}
					}
				}
				else if (arguments.length == 2) {
					for (var i = 0; i < this.length; i++) {
						this[i][prop] = value;
					}
				}
				return this;
			},
			// .toggleProp('value',[1,2,3,4,5,6]) || .toggleProp('value')
			"toggleProp": function(prop, array) {
				var type = {
					"prop": TQuery.type(prop),
					"array": TQuery.type(array)
				};
				//1个值的toggle,增加/删除
				if (arguments.length <= 2 && (type.array !== "array" || type.array == "undefined")) {
					for (var i = 0; i < this.length; i++) {
						if (!this[i][prop]) { //不存在
							this[i][prop] = array;
						} else { //存在
							this[i][prop] = null;
						}
					}
				}
				//多个值得toggle
				else {
					var values = TQuery.toArray(arguments).slice(1)[0];
					var data = this.data('toggleProp');
					if (typeof data.count == "undefined") data.count = 0;
					if (typeof data.values == "undefined") data.values = values;
					this.data('toggleProp', data); //设置属性
					this.prop(prop, values[data.count++ % data.values.length]);
				}
				return this;
			},
			//一个是属性
			"attr": function(attr, value) {
				//2个参数,设置属性
				if (arguments.length == 2) {
					if (attr == "className") {
						attr = "class";
					}
					for (var k = 0; k < this.length; k++) {
						if (this[k][attr]) {
							this[k][attr] = value;
						} else {
							this[k].setAttribute(attr, value);
						}
					}
				}
				//1个参数
				else if (arguments.length == 1) { //1个参数
					//JSON,设置属性
					if (typeof(attr) == "object" && Object.prototype.toString.call(attr).toLowerCase() == "[object object]") { //如果是json,则分别设置属性
						for (var i = 0; i < this.length; i++) {
							for (var j in attr) {
								if (j == "className" || j == "class") {
									var classValue = attr[j];
									this[i].setAttribute("class", classValue);
									continue;
								}
								if (this[i][j]) { //如果属性是可以直接读取
									this[i][j] = attr[j];
								} else { //如果是自定义属性
									this[i].setAttribute(j, attr[j]);
								}
							}
						}
					}
					//读取
					else {
						return this[0][attr] || this[0].getAttribute(attr);
					}
				}
				return this;
			},
			// .toggleProp('data-set',[1,2,3,4,5,6]) || .toggleProp('data-set')
			"toggleAttr": function(attr, array) {
				var type = {
					"attr": TQuery.type(attr),
					"array": TQuery.type(array)
				};
				//1个值的toggle,增加和删除
				if (arguments.length <= 2 && (type.array !== "array" || type.array == "undefined")) {
					for (var i = 0; i < this.length; i++) {
						if (!this[i].getAttribute(attr)) { //不存在
							this[i].setAttribute(attr, array);
						} else { //存在
							this[i].removeAttribute(attr);
						}
					}
				}
				//同时设置多个值的toggle
				else {
					var values = TQuery.toArray(arguments).slice(1)[0];
					var data = this.data('toggleAttr'); //读取属性
					if (typeof data.count == "undefined") data.count = 0;
					if (typeof data.values == "undefined") data.values = values;
					this.data('toggleAttr', data); //设置属性
					this.attr(attr, values[data.count++ % data.values.length]);
				}
				return this;
			},
			"removeAttr": function(attr) {
				for (var i = 0; i < this.length; i++) {
					if (this[i][attr]) {
						delete this[i][attr];
					} else {
						this[i].removeAttribute(attr);
					}
				}
				return this;
			},
			"hasClass": function(obj, classValue) {
				return obj.classList.contains(classValue);
			},
			"addClass": function(classValue) {
				for (var i = 0; i < this.length; i++) {
					this[i].classList.add(classValue);
				}
				return this;
			},
			"removeClass": function(classValue) {
				for (var i = 0; i < this.length; i++) {
					this[i].classList.remove(classValue);
				}
				return this;
			},
			// .toggleProp('class1','class2','class3') || .toggleProp('class1')
			"toggleClass": function() {
				//单个ClassName开关
				if (arguments.length === 1) {
					for (var i = 0; i < this.length; i++) {
						this[i].classList.toggle( arguments[0] );
					}
				}
				//多个className切换
				else{
					var values = TQuery.toArray(arguments);
					var data = this.data('toggleAttr'); //读取属性
					if (typeof data.count == "undefined") data.count = 0;
					if (typeof data.values == "undefined") data.values = values;
					for (var j = 0; j < arguments.length; j++) {
						this.removeClass(arguments[j]);
					}
					this.data('toggleAttr', data); //设置属性
					this.addClass(values[data.count++ % data.values.length]);
				}
				return this;
			},
			// .data('info',{})
			"data": function(key,value) {
				var data = this[0].dataTQuery = this[0].dataTQuery || {};
				//读数据
				if (arguments.length == 1 && typeof data[key] !== "undefined") { 
					return data[key];
				}
				//存数据
				else {
					for (var i = 0; i < this.length; i++) {
						data = this[i].dataTQuery;
						data[key] = value;
					}
				}
				return data;
			},
			"removeData": function(key) {
				var data;
				for (var i = 0; i < this.length; i++) {
					data = this[i].dataTQuery;
					if (data[key]) {
						data[key] = null;
						delete data[key];
						this[i].dataTQuery = data;
					}
				}
			},
			//==============样式=============
			"css": function(attr, value) {
				var type = /^(width|left|top|bottom|right|line-height|font-size)+/ig;
				var type2 = /^(height|margin|padding)+/ig;
				var type3 = /\d+(px)/ig;
				var type4 = /\:/ig;
				//两个参数
				if (arguments.length == 2) {
					//设置
					value += "";
					if (type.test(attr) && value.indexOf('%') < 0) {
						value = parseFloat(value).toFixed(2) + 'px';
					}
					for (var m = 0; m < this.length; m++) {
						this[m].style[attr] = value;
					}
				}
				//一个参数
				else {
					//字符串格式
					if (typeof attr == "string") {
						//设置,background:#303030;font-size:20px;
						//设置样式
						if (type4.test(attr)) {
							for (var x = 0; x < this.length; x++) {
								this[x].style.cssText = attr;
							}
						}
						//读取样式
						else {
							return this[0].currentStyle ? this[0].currentStyle[attr] : getComputedStyle(this[0])[attr];
						}
					}
					//JSON格式
					else if (typeof(attr) == "object" && Object.prototype.toString.call(attr).toLowerCase() == "[object object]" && !attr.length) {
						var css = "",
							key,
							val;
						for (var i = 0; i < this.length; i++) {
							//JS写法
							// for(var k in attr){
							// 	//k == 属性名字,width,height,opacity等
							// 	//attr[k] == 属性值,300px,#303030等
							// 	if((type.test(k) || type2.test(k)) && attr[k].indexOf('%')<0 ){//如果没有%符号
							// 		attr[k] = parseFloat( attr[k] ).toFixed(2) + 'px';
							// 	}
							// 	this[i].style[k] = attr[k];
							// }
							//纯CSS写法
							for (key in attr) {
								//k == 属性名字,width,height,opacity等
								//attr[k] == 属性值,300px,#303030等
								val = attr[key] + "";
								if ((type.test(key) || type2.test(key)) && val.indexOf('%') < 0) { //如果是带像素的属性,并且没有%符号
									val = parseFloat(val).toFixed(2) + 'px';
								}
								css += key + ":" + val + ";";
							}
							this[i].style.cssText = css;
						}
					}
				}
				return this;
			},
			//参数:内容,{}(properties)
			"addStyle": function() {
				var contents,prop,textNode,styleSheet;
				for( var i=0;i<arguments.length;i++ ){
					var agm = arguments[i];
					//Style内容
					if( TQuery.isString(agm) ){
						contents = agm;
					}
					//Style属性
					else if( TQuery.isObject(agm) ){
						prop = agm;
					}
				}
				textNode = doc.createTextNode(contents);
				styleSheet = doc.createElement('style');
				styleSheet.type = "text/css";
				for( var attr in prop ){
					if( typeof styleSheet[attr] !=="undefined" ){
						styleSheet[attr] = prop[attr];
					}
				}
				styleSheet.appendChild(textNode);
				doc.head.appendChild(styleSheet);
				return this;
			},
			//参数:内容,{}(properties)
			"addScript":function(){
				var contents,url,prop,position,textNode,script;
				for( var i=0;i<arguments.length;i++ ){
					var agm = arguments[i];
					//内容
					if( TQuery.isString(agm) ){
						contents = agm;
					}
					//属性
					else if( TQuery.isObject(agm) ){
						prop = agm;
					}
					//position,true为头部,false为尾部
					else if( TQuery.isBoolean(agm) ){
						position = agm;
					}
				}
				contents = contents ? contents : "";
				textNode = doc.createTextNode(contents);
				script = doc.createElement('script');
				script.type = "text/javascript";
				for( var attr in prop ){
					if( !TQuery.isUndefined(script[attr]) ){
						script[ attr ] = prop[attr];
					}
				}
				script.appendChild(textNode);
				//插入头部
				if( position===true ){
					doc.head.appendChild(script);
				}
				//插入尾部
				else{
					doc.body.appendChild(script);
				}
				return this;
			},
			//参数:{}(properties)
			"addLink":function(){
				var link = doc.createElement('link');
				for( var attr in arguments[0] ){
					link[ attr ] = arguments[0][ attr ];
				}
				doc.head.appendChild( link );
				return this;
			},
			//==============动画=============
			//animate({},load,speed,callBack)
			"animate": function() {
				var properties,load,speed,callBack,this_ = this,fps = parseInt(1000/60);
				for( var o=0;o<arguments.length;o++ ){
					var agm = arguments[o];
					// properties
					if( TQuery.isObject( agm ) ){
						properties = agm;
					}
					// load
					else if( TQuery.isFunction( agm ) && o!==arguments.length-1 ){
						load = agm;
					}
					// speed
					else if( TQuery.isNumber( agm ) || ( TQuery.isString(agm) &&  agm>=0) ){
						speed = agm;
					}
					// callBack
					else if( TQuery.isFunction( agm ) && o==arguments.length-1 ){
						callBack = agm;
					}
				}
				for (var i = 0; i < this.length; i++) {
					var _this = this[i];
					clearInterval(_this.animate);
					_this.animate = setInterval(function() {
						var bStop = true,
							current,
							target;
							
						for (var attr in properties) {
							// 1. 取得当前的值(可以是width,height,opacity等的值)
							current = 0; //当前值
							target = 0; //目标值
							if (attr == 'opacity') {
								current = Math.round(parseFloat($(_this).style(attr)) * 100);
								target = parseFloat(properties[attr]) * 100;
							}
							else if( attr== 'scrollTop' ){
								current = parseInt( this_.scrollTop() );
								target = parseInt( properties[attr] );
							}
							else {

								current = parseInt($(_this).style(attr));
								target = parseFloat(properties[attr]);
							}
							// 2.计算运动速度
							var speedConfig = typeof(speed) != 'undefined' ? speed : 10;
							var iSpeed = (target - current) / speedConfig;
							iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
							// 3. 检测所有运动是否到达目标
							if ((iSpeed > 0 && current <= target) || (iSpeed < 0 && current >= target)) {
								bStop = false;
							}
							// 4. 开始运动
							if (attr == "opacity") {
								_this.style.filter = 'alpha(opacity=' + (current + iSpeed) + ')';
								_this.style.opacity = (current + iSpeed) / 100;
							}
							else if( attr == 'scrollTop' ){
								this_.scrollTo( target );
							}
							else {
								_this.style[attr] = current + iSpeed + 'px';
							}
							load && load.call(_this);
							// 4. 运动停止
							if (bStop) {
								clearInterval(_this.animate);
								callBack && callBack.call(_this);
							}
						}
					},fps);
				}
				return this;
			},
			//animateToggle({},{},{},{})
			"animateToggle":function(){
				var _arguments = arguments;
				var data = this.data('animateToggle'); //获取属性
				if (typeof data.count == "undefined") data.count = 0;
				if (typeof data.objLength == "undefined") data.objLength = _arguments.length;
				this.data('animateToggle', data); //设置属性
				for (var i = 0; i < this.length; i++) {
					this.animate( _arguments[data.count++ % data.objLength] );
				}
				return this;
			},
			"stop": function(delay) {
				var stardelay = delay ? delay : 0;
				setTimeout(function() {
					clearInterval($(this)[0].animate);
				}, stardelay);
				return this;
			},
			"show": function() {
				for (var i = 0; i < this.length; i++) {
					this[i].style.display = 'block';
				}
				return this;
			},
			"hide": function() {
				for (var i = 0; i < this.length; i++) {
					this[i].style.display = 'none';
				}
				return this;
			},
			"fadeToggle": function() {
				var _this = this;
				this.toggle(function() {
					_this.fadeOut();
				}, function() {
					_this.fadeIn();
				});
				return this;
			},
			"fadeIn": function(callBack) {
				var _this = this;
				this.css('display', 'block');
				this.animate({
					"opacity": 1
				},function(){
					if (callBack) callBack(this);
				});
			},
			"fadeOut": function(callBack) {
				var _this = this;
				this.animate({
					"opacity": 0
				},function(){
					_this.css('display', 'none');
					if (callBack) callBack(this);
				});
			},
			"fadeTo": function(target, callBack) {
				var _this = this;
				this.animate({
					"opacity": target
				}, function(){
						if (target <= 0) {
							_this.css('display', 'none');
						} else {
							_this.css('display', 'block');
						}
						if (callBack) callBack(this);
				});
			},
			"scale": function(times,callBack) {
				callBack = TQuery.isFunction(callBack) ? callBack : TQuery.noop;
				var prop = {},width,height,arr = [],
					eles = this.toArray();
				for( var i=0;i<eles.length;i++ ){
					var _this = $(eles[i]);
					width = _this.data('size').width || _this.width();
					height = _this.data('size').height || _this.height();
					_this.data("size",{"width":width,"height":height});
					_this.animate( {"width":width*times,"height":height*times},callBack );
				}
				return this;
			},
			//scaleToggle(2,3,1,0.5,callBack)
			"scaleToggle":function(){
				var agms = arguments,_arguments,callBack;
				//如果最后一位是function,则最为回掉
				if( TQuery.isFunction( agms[length-1] ) ) {
					callBack = agms[length-1];
					_arguments = TQuery.toArray(arguments).splice(0,arguments.length-1);
				}else{
					callBack = TQuery.noop;
					_arguments = TQuery.toArray(arguments);
				}
				var data = this.data('scaleToggle'); //获取属性
				if (typeof data.count == "undefined") data.count = 0;
				if (typeof data.agms == "undefined") data.agms = _arguments.length;
				this.data('scaleToggle', data); //设置属性
				this.scale( _arguments[data.count++ %data.agms] ,callBack);
				return this;
			},
			"toggle": function() {
				var _arguments = arguments;
				var data = this.data('toggle'); //获取属性
				if (typeof data.count == "undefined") data.count = 0;
				if (typeof data.fns == "undefined") data.fns = _arguments.length;
				this.data('toggle', data); //设置属性
				for (var i = 0; i < this.length; i++) {
					_arguments[data.count++ % data.fns].call(this[i]);
				}
				return this;
			},
			"slideToggle": function() {
				var _this = this;
				this.toggle(function() {
					$(this).slideUp();
				}, function() {
					$(this).slideDown();
				});
				return this;
			},
			"slideRight": function(callBack) {
				var width = this.data('size').width;
				this.show().animate({
					"width": width
				}, function(){
					if (callBack) callBack.call(this);
				});
				return this;
			},
			"slideLeft": function(callBack) {
				var size = this.data('size');
				if (typeof size.width == "undefined") {
					this.data('size').width = this.width();
				}
				var _this = this;
				this.animate({
					"width": 0
				},function(){
					_this.hide();
					if (callBack) callBack.call(this);
				});
				return this;
			},
			"slideDown": function(callBack) {
				var height = this.data('size').height;
				this.show().animate({
					"height": height
				}, function(){
					if (callBack) callBack.call(this);
				});
				return this;
			},
			"slideUp": function(callBack) {
				var size = this.data('size');
				if (typeof size.height == "undefined") {
					this.data('size').height = this.height();
				}
				var _this = this;
				this.animate({
					"height": 0
				}, function(){
					_this.hide();
					if (callBack) callBack.call(this);
				});
				return this;
			},
			"scrollTo": function(target, callBack) {
				//传入DOM节点
				if ( TQuery.isDOM(target) ) {
					target = parseInt($(target).offset('top'));
				}
				//传入选择符,字符串
				else if ( typeof target == "string" ) {
					//字符串数字
					if (target > 0) {
						target = parseInt(target);
					} else {
						target = $(target).offset('top');
					}
				}
				//传入TQuery对象
				else if (typeof target.TQuery !== "undefined") {
					target = target.offset('top');
				}
				var _this = this,
					nowScrollTop, dif, speed, position,
					pageHeight = $(doc).height() - $(doc).viewHeight();
				target = target < 0 ? 0 : (target < pageHeight ? target : pageHeight); //超出范围
				clearInterval(doc.timerScroll);
				doc.timerScroll = setInterval(function() {
					nowScrollTop = doc.body.scrollTop || doc.documentElement.scrollTop;
					dif = Math.abs(nowScrollTop - target); //差值
					speed = nowScrollTop - target < 0 ? (dif / 10) + 1 : -((dif / 10) + 1);
					position = nowScrollTop + (speed);
					if ((speed > 0 && position >= target) || (speed < 0 && position <= target)) {
						doc.body.scrollTop = doc.documentElement.scrollTop = target;
						clearInterval(doc.timerScroll);
						if (callBack) callBack.call(_this[0]);
					} else {
						doc.body.scrollTop = doc.documentElement.scrollTop = position;
					}
				}, parseInt(1000 / 60));
				return this;
			},
			"scrollToggle": function() {
				var data = this.data('toggleClick'); //获取属性
				if (typeof data.count == "undefined") data.count = 0;
				if (typeof data.targets == "undefined") data.targets = arguments;
				this.data('toggleClick', data); //设置属性
				this.scrollTo(data.targets[data.count++ % arguments.length]);
				return this;
			},
			//==============DOM=============
			"replace":function(DOMNode){
				//传入DOM节点
				if( TQuery.isDOM( DOMNode ) ){
					DOMNode = DOMNode;
				}
				//传入DOM字符串
				else{

				}
				//替换
				for( var i=0;i<this.length;i++ ){
					doc.body.replaceChild(DOMNode,this[i]);//DOMNode替换掉this[i]
				}
				return this;
			},
			"replaceAll":function(){
				
			},
			"replaceWidth":function(){
				
			},
			"clone": function(deep) {
				var newElements = [],
					cloneNode;
				for (var i = 0; i < this.length; i++) {
					cloneNode = this[i].cloneNode(true); //带子节点
					if (deep && deep === true) { //深度克隆,带事件

					}
				}
				return this;
			},
			"append": function(content) {

			},
			"appendChild": function(content) {

			},
			"prepend": function(prepend) {

			},
			"prependChild": function() {

			},
			//插入到DOMNode之后
			"after": function(DOMNode) {
				var parent,
					oFragment = doc.createDocumentFragment(); //创建文档碎片;
				for (var i = 0; i < this.length; i++) {
					oFragment.appendChild(this[i]);
				}
				parent = DOMNode.parentNode; //插入位置的父元素
				if (parent.lastChild == DOMNode) { //如果最后的节点是目标节点,直接添加
					parent.appendChild(oFragment);
				} else { //如果不是,则插入在目标元素的下一个兄弟节点的前面,也就是目标元素的后面
					parent.insertBefore(oFragment, DOMNode.nextSibling);
				}
				return this;
			},
			//插入到DOMNode之前
			"before": function(DOMNode) {
				var oFragment = doc.createDocumentFragment(); //创建文档碎片
				for (var i = 0; i < this.length; i++) {
					oFragment.appendChild(this[i]);
				}
				DOMNode.parentNode.insertBefore(oFragment, DOMNode);
				return this;
			},
			"remove": function() {
				for (var i = 0; i < this.length; i++) {
					this[i].remove();
				}
				return this;
			},
			"empty": function() {
				this.text(' ');
				this.html(' ');
				return this;
			},
			"html": function(setting) {
				if (setting) {
					for (var i = 0; i < this.length; i++) {
						this[i].innerHTML = setting;
					}
					return this;
				} else {
					return this[0].innerHTML;
				}
			},
			"text": function(setting) {
				if (setting) {
					for (var i = 0; i < this.length; i++) {
						this[i].innerText = this[i].textContent = setting;
					}
					return this;
				} else {
					return this[0].innerText || this[0].textContent;
				}
			},
			//带标签,注释
			"contents":function(setting){
				if (setting) {
					for (var i = 0; i < this.length; i++) {
						this[i].outerText = this[i].outerHTML = setting;
					}
					return this;
				} else {
					return this[0].outerText || this[0].outerHTML;
				}
			},
			"val": function(setting) {
				if (setting) {
					this.prop("value",setting);
					return this;
				} else {
					return this[0].value;
				}
			},
			//==============其他=============
			"proxy": function(fn, _this) {
				fn.call(_this);
				return this;
			},
			"delay": function(fn, time) {
				var _this = this;
				setTimeout(function() {
					fn.call(_this);
				}, time);
				return this;
			},
			"do": function(fn) {
				fn.call(this);
				return this;
			},
			//==============转换=============
			"get": function(n) {
				n = n || 0;
				return this[n];
			},
			"toArray": function() {
				var temp = [];
				for (var i in this) {
					if (i >= 0) temp.push(this[i]);
				}
				return this.init.elements ? this.init.elements : temp;
			},
			"index": function(n) {
				var _this = this,
					index = 0,
					brothers = _this[0].parentNode.children;
				for (var i = 0; i < brothers.length; i++) { //遍历
					if (brothers[i] == this[0]) { //如果匹配到
						index = i;
						break;
					}
				}
				return index;
			}
		};
		TQuery.fn.init.prototype = TQuery.fn;
		//==============工具集=============
		//****检查类型****
		TQuery.type = function(obj) {
			var string = Object.prototype.toString.call(obj);
			return string.split(" ")[1].replace(/\]|\[/img, "").toString().toLowerCase();
		};
		TQuery.isNumber = function(obj) {
			if (typeof obj == "number" && !isNaN(obj)) {
				return true;
			} else {
				return false;
			}
		};
		TQuery.isString = function(obj) {
			if (typeof obj == "string" || obj instanceof String) {
				return true;
			} else {
				return false;
			}
		};
		TQuery.isFunction = function(obj) {
			if (typeof obj == "function" && obj instanceof Function && Object.prototype.toString.call(obj) === '[object Function]') {
				return true;
			} else {
				return false;
			}
		};
		TQuery.isArray = function(obj) {
			return Array.isArray ? Array.isArray(obj) : Object.prototype.toString.call(obj) === '[object Array]';
		};
		TQuery.isObject = function(obj) {
			return Object.prototype.toString.call(obj) === '[object Object]';
		};
		TQuery.isDOM = function(obj) {
			//IE8下,一切皆为object
			return /html|document|element|object/img.test(Object.prototype.toString.call(obj).split(" ")[1]) && typeof obj.parentNode !=="undefined";
		};
		TQuery.isBoolean = function(obj){
			return (obj===true || obj===false) ? true : Object.prototype.toString.call(obj)==='[object Boolean]';
		};
		TQuery.isWindow = function(obj) {
			return (obj == obj.obj && typeof obj == "object") ? true : false;
		};
		TQuery.isUndefined = function(obj) {
			return Object.prototype.toString.call(obj) === '[object Undefined]';
		};
		//创新一个新的TQuery副本,可以自行修改方法,属性,而不影响原有的。
		TQuery.sub = function(selectors){
			//构造函数
			var newTQuery = function(selectors){
				return newTQuery.fn.init(selectors);
			};			
			for( var prop in $ ){
				newTQuery[prop] = $[prop];
			}
			var prototype = {};
			for( var attr in $.prototype ){
				prototype[attr] = $.prototype[attr];
			}
			newTQuery.fn = newTQuery.prototype = prototype;
			newTQuery.fn.init.prototype = newTQuery.fn;
			return newTQuery;
		};
		//****AJAX****
		TQuery.ajax = function(options) {
			var oAjax,
				data = options.data ? options.data : "", //头部信息。必须是数组[key,value]
				context = options.context ? options.context : win, //执行上下文,this
				type = options.type ? options.type : 'GET', //请求方式
				async = options.async ? options.async : true; //默认异步加载
			if (win.XMLHttpRequest) { //IE7+,chrome,firefox,opara,safari
				oAjax = new XMLHttpRequest();
			} else {
				oAjax = new ActiveXObject("Microsoft.XMLHTTP"); //IE5,IE6
			}

			if (options.beforeSend) options.beforeSend.call(context); //发送之前

			oAjax.setRequestHeader(data[0], data[1]); //设置头部信息
			oAjax.open(options.type, options.url, async);
			oAjax.send();
			oAjax.onreadystatechange = function() {
				if (oAjax.readyState == 4) {
					if (options.complete) options.complete.call(context, oAjax.status); //读取完成
					if (oAjax.status == 200) {
						if (options.success) options.success.call(context, oAjax.responseText); //读取成功
					} else {
						if (options.fail) options.fail.call(context, oAjax.status); //读取失败
					}
				}
			};
		};
		//****对象操作****
		//去重复
		TQuery.unique = function(obj) {
			var V = {
				"hash": {},
				"arr": [],
				"length": obj.length
			};
			for (var i = 0; i < V.length; i++) {
				if (typeof V.hash[obj[i]] == "undefined") {
					V.hash[obj[i]] = 1;
					V.arr.push(obj[i]);
				}
			}
			return V.arr;
		};

		//空函数,同jquery
		TQuery.noop = function() {
			return;
		};

		//去掉首尾空格,同jquery
		TQuery.trim = function(str) {
			var newStr = str.replace(/^\s*(\S*)\s*$/img, "$1");
			return newStr;
		};

		//返回当前时间,同jquery
		TQuery.now = function() {
			return (new Date()).getTime();
		};
		//刷新页面,同jquery
		TQuery.reload = function() {
			win.location.reload(true);
		};
		//将类数组转成数组
		TQuery.toArray = function(iArray) {
			var temp = [];
			for (var i = 0; i < iArray.length; i++) {
				temp.push(iArray[i]);
			}
			return temp;
		};
		//单词首字母大写
		TQuery.upper = function(str) {
			var reg = /\b(\w)|\s(\w)/g;
			str = str.toLowerCase();
			return str.replace(reg, function(m) {
				return m.toUpperCase();
			});
		};
		//打乱数组,同jquery
		TQuery.shuffleArray = function(arr) {
			var V = {
				"temp": [],
				"length": arr.length
			};
			for (var i = 0; i < V.length; i++) {
				V.temp.push(arr[i]);
			}
			V.temp.sort(function() {
				return Math.random() - 0.5;
			});
			return V.temp;
		};

		//获取对象的长度
		TQuery.sizeof = function(obj) {
			var V = {
				"temp": [],
				"length": 0
			};
			for (var attr in obj) {
				V.length++;
			}
			return V.length;
		};
		//获取浏览器信息
		var ua = navigator.userAgent;
		TQuery.browser = function() {
			var name = null;
			var vision = null;
			var content = null;
			//IE
			if( /msie|Trident/img.test(ua) ){
				name = "ie";
				content = ua.match( /MSIE\s\d+\.\d/img );
				if( content===null || typeof content === "undefined" ){
					vision = 11;//IE11
				}else{
					vision = content[0].split(" ")[1];
				}
			}
			//webkit
			else if(/webkit/img.test(ua)){
				name = "chrome";
				content = ua.match( /Chrome\/[\d\.]+/img );
				vision = content[0].split("/")[1];
			}
			//moz
			else if(/firefox/img.test(ua)){
				name = "firefox";
				content = ua.match( /Firefox\/[\d\.]+/img );
				vision = content[0].split("/")[1];
			}
			//opera
			else if(/opera|Presto/img.test(ua)){
				name = "opera";
				content = ua.match( /Opera\/[\d\.]+/img );
				vision = content[0].split("/")[1];
			}
			return {
				"name":name,
				"vision":vision
			};
		};
		TQuery.browser.webkit = function() {
			var content = ua.match( /Chrome\/[\d\.]+/img );
			if( /webkit/img.test(ua)===false ){
				return false;//不是webkit
			}else{
				if( content===null && typeof content =="undefined" ){
					return true;
				}
				return content[0].split("/")[1];//返回版本号
			}
		};
		TQuery.browser.msie = function() {
			var content = ua.match( /MSIE\s\d+\.\d/img );
			if( !/msie|Trident/img.test(ua) ){
				return false;//不是IE
			}else{
				if( content===null || typeof content === "undefined" ){
					return 11;//IE11
				}else{
					TQuery.browser.vision = content[0].split(" ")[1];
					return content[0].split(" ")[1];//IE11以下版本号

				}
			}
		};
		TQuery.browser.moz = function() {
			var content = ua.match( /Firefox\/[\d\.]+/img );
			if( !/firefox/img.test(ua) ){
				return false;//不是moz
			}else{
				if( content===null && typeof content =="undefined" ){
					return true;
				}
				return content[0].split("/")[1];//返回版本号
			}
		};
		TQuery.browser.opera = function() {
			var content = ua.match( /Opera\/[\d\.]+/img );
			if( !/Opera/img.test(ua) ){
				return false;//不是opera
			}else{
				if( content===null && typeof content =="undefined" ){
					return true;
				}
				return content[0].split("/")[1];//返回版本号
			}
		};
		//合并对象
		TQuery.merge = function() {
			//合并json
			if (TQuery.type.isObject(arguments[0])) {
				var object = new Object({});
				for (var i = 0; i < arguments.length; i++) {
					for (var key in arguments[i]) {
						if (typeof object[key] == "undefined") { //默认不覆盖
							object[key] = arguments[i][key];
						}
					}
				}
				return object;
			}
			//合并数组
			else if (TQuery.type.isArray(arguments[0])) {
				var newArray = [];
				for (var k = 0; k < arguments.length; k++) {
					newArray = newArray.concat(arguments[k]);
				}
				return newArray;
			}
		};

		//遍历对象
		TQuery.map = function(obj, fn) {
			var temps = [],
				returnValue;
			if (this.type.isArray(obj)) {

				for (var i = 0; i < obj.length; i++) {
					returnValue = fn.call(obj, obj[i], i);
					if (returnValue && returnValue !== "undefined" || returnValue !== null) {
						temps.push(returnValue);
					}
				}
			} else if (this.type.isObject(obj)) {
				for (var key in obj) {
					returnValue = fn.call(obj, key, obj[key]);
					if (returnValue && returnValue !== "undefined" || returnValue !== null) {
						temps.push(returnValue);
					}
				}
			}
			return temps;
		};
		//转换JSON
		TQuery.parseJSON = function(str, compatibility) {
			return (compatibility && compatibility === true) ? (new Function("return " + str))() : JSON.parse(str);
		};
		//插件入口
		TQuery.extend = TQuery.fn.extend = function(object) {
			for( var name in object ){
				if( TQuery.isUndefined(TQuery.prototype[name]) ){
					TQuery.fn[name] = TQuery.prototype[name] = object[name];
				}
			}
			return this;
		};

		return TQuery;
	})();


	//公共函数
	function addEvent(obj, type, fn) {
		var ev = null;
		return obj.addEventListener ?
			obj.addEventListener(type, function(e) {
				ev = win.event ? win.event : (e ? e : null);
				ev.target = ev.target || ev.srcElement;
				if (fn.call(obj, ev) === false) {
					return stop.call(ev);
				}
			}, false) :
			obj.attachEvent('on' + type, function(e) {
				ev = win.event ? win.event : (e ? e : null);
				ev.target = ev.target || ev.srcElement;
				ev.preventDefault = function(){
					if (typeof this.preventDefault !== "undefined") this.preventDefault(); //w3c标准
					if (typeof this.returnValue !== "undefined") this.returnValue = false; //阻止默认事件,针对老版本IE
				};
				if (fn.call(obj, ev) === false) {
					return stop.call(ev);
				}
			});
	}
	//禁止冒泡和默认事件。
	function stop() {
		if (typeof this.stopPropagation !== "undefined") this.stopPropagation(); //阻止冒泡,w3c标准
		if (typeof this.cancelBubble !== "undefined") this.cancelBubble = true; //阻止冒泡,ie,firefox
		if (typeof this.preventDefault !== "undefined") this.preventDefault(); //w3c标准
		if (typeof this.returnValue !== "undefined") this.returnValue = false; //阻止默认事件,针对老版本IE
		return false;
	}

	win.TQuery = win.$ = $;
})(window, document, undefined);