Greasy Fork is available in English.

TQuery

我的仿jq库

このスクリプトは単体で利用できません。右のようなメタデータを含むスクリプトから、ライブラリとして読み込まれます: // @require https://update.greasyfork.org/scripts/11045/1366091/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);