/** * Created by Turbo on 2016/3/27. */ (function ( window, undefined ) { var arr = [], push = arr.push, slice = arr.slice, concat = arr.concat; //Tur_jq 构造函数 var Tur_jq = function Tur_jq ( selector ){ return new Tur_jq.prototype.init( selector ); }; Tur_jq.fn = Tur_jq.prototype = { constructor:Tur_jq, selector:null, length:0, init:function( selector ) { //是空的和undefined 直接返回 if (!selector) return this; // 字符串:选择器,html if (Tur_jq.isString(selector)) { if (selector.charAt(0) === '<') { Tur_jq.push.apply(this, Tur_jq.parseHTML(selector)); } else { Tur_jq.push.apply(this, Tur_jq.select(selector)); this.selector = selector; } return this; } //DOM 对象 if (Tur_jq.isDOM( selector )){ this[0] = selector; this.length =1; return this; } //Tur_jq 对象 if( Tur_jq.isTur_jq( selector )){ return selector; } // DOM 数组 if( Tur_jq.isLikeArray( selector )){ Tur_jq.push.apply( this ,selector ); return this; } // 如果是函数的话 就是入口函数 if( Tur_jq.isFunction( selector ) ){ var oldFn = window.onload; if( typeof oldFn ==='function' ){ window.onload = function(){ oldFn(); selector(); }; }else { window.onload = selector; } } }, each:function( callback ){ Tur_jq.each( this ,callback ); return this; } }; Tur_jq.fn.init.prototype = Tur_jq.prototype; //可扩展 Tur_jq.extend = Tur_jq.fn.extend = function( obj ){ var k ; for( k in obj ){ this[k] = obj [k]; } }; var select = (function(){ //push 能力检测 var push =[].push; try{ var div = document.createElement('div'); div.appendChild(document.createElement('div')); var list = div.getElementsByTagName('*'); push.apply([],list); }catch(e){ push={ apply:function(arr,list){ var j=arr.length, i=0; while(arr[j++] = list[i++]){} arr.length=j-1; } }; }finally{ //回收 div = list = null; } //浏览器能力检测 var support ={}; support.getElementsByClassName = (function(){ var isExit = !!document.getElementsByClassName; if(isExit && typeof(document.getElementsByClassName)==='function'){ var divNode = document.createElement('div'), divNode2 = document.createElement('div'); divNode2.className ='c'; divNode.appendChild(divNode2); return divNode.getElementsByClassName('c')[0]===divNode2; } return false; })(); // each 方法 var each = function(arr , fn){ var i; for(i=0; i<arr.length;i++){ // call 第一个参数将 this 指向传给他的参数 // 回调函数返回false 用来跳出循环 if( fn.call(arr[i],i,arr[i] )===false ){ //跳出循环 break; } } }; // 去空格 var myTrim = function( str ){ if(String.prototype.trim ){ return str.trim(); }else{ return str.replace(/^\s+|\s+$/g,''); } }; //indexOf 方法 var indexOf = function( list ,elem ){ var i= 0,len = list.length; for(; i<len;i++ ){ if( list[i]===elem ){ return i; } } return -1; }; //id选择器 var getId = function( id, context ,results ){ context = context || document; results = results || []; push.call( results ,context.getElementById(id)); return results; }; //class 选择器 var getClass = function( className , context ,results ){ context = context || document; results = results || []; if( support.getElementsByClassName ){ push.apply( results ,context.getElementsByClassName(className)); }else{ each( getTag('*',context),function(i ,v){ if((" "+ v.className +' ' ).indexOf(" "+className+' ')!==-1){ push.call( results ,v ); } }); } return results; }; //标签选择器 var getTag = function( tag ,context ,results ){ context = context || document; results = results || []; push.apply( results ,context.getElementsByTagName( tag )); return results; }; //后代选择器 var get = function( select ,context ,results ){ results = results || []; context = context || document; var rquickRegEx = /^(?:#([\w-]+)|\.([\w-]+)|([\w-]+)|(\*))$/, m = rquickRegEx.exec(myTrim(select)); if( m ){ if( context.nodeType ){ context = [context]; } if( typeof ( context )=='string' ){ context = get( context ); } //? each( context ,function( i , v){ if( m[1] ){ results = getId( m[1] , this , results ); }else if( m[2] ){ results = getClass( m[2],this,results ); }else if( m[3] ){ results = getTag( m[3] ,this ,results ); }else if( m[4] ){ results = getTag( m[4], this, results ); } }); } return results; }; //对外开放的函数 var select = function( select ,context ,results ){ results = results ||[]; context = context || document; var newSelector = select.split(','); each( newSelector , function( i , v ){ var list = v.split(' '); var c = context; for( var i =0 ;i<list.length;i++ ){ if( list[i]=='' )continue; c= get(list[i],c); } push.apply(results ,c); }); return results; }; return select; })(); var parseHTML = function( html ){ var div = document.createElement('div'), arr = [],i; div.innerHTML = html; for( i=0;i< div.childNodes.length ;i++){ arr.push( div.childNodes[i] ); } return arr; }; Tur_jq.extend({ select : select, parseHTML:parseHTML }); //基本的工具方法 each trim push Tur_jq.extend({ each:function(arr , fn ){ var i,l = arr.length, isArray = Tur_jq.isLikeArray(arr); if( isArray ){ //数组 for( i=0 ;i<l;i++ ){ if( fn.call( arr[i] ,i ,arr[i] )===false ){ break; } } }else{ // 对象 for( i in arr ){ if( fn.call( arr[i],i,arr[i] )===false ){ break; } } } return arr; }, trim:function( str ){ return str.replace( /^\s+|\s+$/g,"" ); }, push:push }); // 判断类型的方法 isFunction isString isLikeArray isItcast isDOM Tur_jq.extend({ isFunction:function(obj){ return typeof obj === 'function'; }, isString:function( obj ){ return typeof obj ==='string'; }, isLikeArray: function( obj ){ return obj && obj.length && obj.length >=0; }, isTur_jq:function( obj ){ return 'selector' in obj; }, isDOM:function( obj ){ return !!obj.nodeType; } }); // 基本的DOM 操作 firstChild nextSibling nextAll Tur_jq.extend({ firstChild:function(dom){ var node; Tur_jq.each( dom.childNodes, function(i ,v ){ if( this.nodeType ===1 ){ node = this; return false; } }); return node; }, nextSibling:function( dom ){ var newDom = dom; while( newDom = newDom.nextSibling ){ if( newDom.nodeType === 1 ){ return newDom; } } }, nextAll:function( dom ){ var newDom = dom, arr=[]; while( newDom = newDom.nextSibling ){ if( newDom.nodeType ===1 ){ arr.push( newDom ); } } return arr; } }); // 事件模块 Tur_jq.fn.extend({ on:function( type ,callback ){ this.each(function(){ if( this.addEventListener ){ this.addEventListener(type , callback); }else{ this.attachEvent('on'+type,callback); } }); return this; }, off:function( type ,callback ){ this.each( function( i ,v ){ v.removeEventListener(type ,callback); }); return this; } }); // 其他事件 Tur_jq.each( ("click,mouseover,mouseout,mouseenter,mouseleave," + "mousemove,mousedown," + "mouseup,keydown,keyup" ).split(','), function ( i, v ) { Tur_jq.fn[v] = function (callback) { return this.on(v, callback); } }); // 对实例开发的hover toggle Tur_jq.fn.extend({ hover:function( fn1 , fn2 ){ return this.mouseover( fn1).mouseout(fn2); }, toggle:function(){ var args = arguments,i=0; return this.click( function (e){ args[ i++ % args.length].call( this ,e ); } ) } }); // css 模块 Tur_jq.fn.extend({ css:function( cssName , cssValue ){ //如果传进来的是{ } if( typeof cssName =='object' ){ return this.each( function(){ var k ; for( k in cssName ){ this.style[k] = cssName[k]; } }); }else if( cssValue === undefined ){ return window.getComputedStyle( this[0] )[ cssName ]; }else{ return this.each( function(){ this.style[cssName]= cssValue; }); } }, hasClass:function( cName ){ // cname 可能是 'c1 c2 c3' var has = false; Tur_jq.each( this[0].className.split(' '),function( i , v ){ if( v=== cName ){ has = true; return false; } }); return has; }, addClass:function( cName ){ //ok return this.each( function(){ var className = this.className; className += " "+cName; this.className = Tur_jq.trim( className ); }); }, removeClass:function( cName ){ //将this 中每一个DOM 对象的ClassName 属性中符合cName 的删除掉 return this.each( function(){ this.className = Tur_jq.trim( (" "+this.className +" " ).replace(" "+cName+' '," ")); }); }, toggleClass:function( cName ){ if( this.hasClass(cName)){ this.removeClass(cName); }else{ this.addClass(cName); } } }); //属性操作 Tur_jq.fn.extend({ attr:function( attName , attValue ){ if( arguments.length ==1 ){ return this[0][attName]; }else{ return this.each(function(){ this[attName]= attValue; }); } }, val:function( value ){ if( value === undefined ){ return this[0].value; }else{ return this.each( function(){ this.value = value; }); } } }); //内容处理模块 Tur_jq.extend({ getInnerText:function( dom ){ var list =[]; if( dom.innerText !==undefined ){ return dom.innerText; }else{ getTextNode( dom, list ); return join(''); } function getTextNode ( dom ,arr ){ //将dom 里面的所有的文本节点放到arr 中 var i, l= dom.childNodes.length,node; for( i=0 ;i<l;i++ ){ node = dom.childNodes[i]; //文本节点 if( node.nodeType ===3 ){ arr.push( node.nodeValue ); }else{ getTextNode(node ,arr ); } } } }, setInnerText:function( dom ,str ){ if( 'innerText' in dom ){ dom.innerText = str; }else{ dom.innerHTML =''; dom.appendChild(document.createTextNode( str )); } } }); //html text Tur_jq.fn.extend({ html:function(html ){ if( html === undefined ){ // 返回 0 元素的innerHTML return this[0].innerHTML; }else{ return this.each( function(){ this.innerHTML = html; }); } }, text:function(text){ if( text ===undefined ){ return Tur_jq.getInnerText( this[0] ); }else{ return this.each(function(){ Tur_jq.setInnerText(this,text); }); } } }); // 对外公开 window.T = window.Tur_jq = Tur_jq; })( window );