javascript常用工具类

  1 $util = {
  2     /**
  3     * 类型检测
  4     */
  5     type : function(obj){
  6         var rep = /\[object\s+(\w+)\]/i;
  7         var str = Object.prototype.toString.call(obj).toLowerCase();
  8         str.match(rep);
  9         return RegExp.$1;
 10     },
 11     /**
 12     * 深拷贝
 13     */
 14     $unlink :function (object){
 15         var unlinked;
 16         switch ($type(object)){
 17             case 'object':
 18                 unlinked = {};
 19                 for (var p in object) {
 20                     unlinked[p] = $unlink(object[p]);
 21                 }
 22             break;
 23             case 'array':
 24                 unlinked = [];
 25                 for (var i = 0, l = object.length; i < l; i++) {
 26                     unlinked[i] = $unlink(object[i]);
 27                 }
 28             break;
 29             default: return object;
 30         }
 31         return unlinked;
 32     },
 33     /**
 34     *Dom 相关操作
 35     */ 
 36     dom:{
 37         $: function(id) {
 38             return document.getElementById(id);
 39         },
 40         getStyle: function(obj, prop) {
 41             var style = obj.currentStyle || window.getComputedStyle(obj, '');
 42             if (obj.style.filter) {
 43                 return obj.style.filter.match(/\d+/g)[0];
 44             }
 45             return style[prop];
 46         },
 47         setStyle: function(obj, prop, val) {
 48             switch (prop) {
 49             case 'opacity':
 50                 if($util.client.browser.ie){
 51                     obj.style.filter = 'alpha(' + prop + '=' + val*100 + ')'    
 52                 }else{
 53                     obj.style[prop] = val;
 54                 }
 55                 break;
 56             default:
 57                 obj.style[prop] = val + 'px';
 58                 break;
 59             }
 60         },
 61         setStyles: function(obj, props) {
 62             for (var prop in props) {
 63                 switch (prop) {
 64                 case 'opacity':
 65                     if($util.client.browser.ie){
 66                         obj.style.filter = 'alpha(' + prop + '=' + props[prop] + ')'        
 67                     }else{
 68                         obj.style[prop] = props[prop];
 69                     }
 70                     break;
 71                 default:
 72                     obj.style[prop] = props[prop] + 'px';
 73                     break;
 74                 }
 75             }
 76         }
 77     },
 78     /**
 79     *Event 事件相关
 80     */
 81     evt : {
 82         addEvent : function(oTarget, sEventType, fnHandler) {
 83             if (oTarget.addEventListener) {
 84                 oTarget.addEventListener(sEventType, fnHandler, false);
 85             } else if (oTarget.attachEvent) {
 86                 oTarget.attachEvent("on" + sEventType, fnHandler);
 87             } else {
 88                 oTarget["on" + sEventType] = fnHandler;
 89             }
 90         },
 91         rmEvent : function removeEventHandler (oTarget, sEventType, fnHandler) {
 92             if (oTarget.removeEventListener) {
 93                 oTarget.removeEventListener(sEventType, fnHandler, false);
 94             } else if (oTarget.detachEvent) {
 95                 oTarget.detachEvent("on" + sEventType, fnHandler);
 96             } else { 
 97                 oTarget["on" + sEventType] = null;
 98             }
 99         }
100     },
101     /**
102     *Ajax 异步加载
103     */
104     ajax : {
105         request:function (options) {
106                 var xhr, res;
107                 var url = options.url, 
108                     context = options.context, 
109                     success = options.success, 
110                     type = options.type, 
111                     datatype = options.datatype, 
112                     async = options.async, 
113                     send = options.send,
114                     headers = options.headers;
115                     
116                 try {
117                     xhr = new XMLHttpRequest();
118                 } catch(e) {
119                     try {
120                         xhr = new ActiveXObject('MSXML2.XMLHTTP');
121                     } catch(e) {
122                         xhr = new ActiveXObject('Microsoft.XMLHTTP');
123                     }
124                 }
125                 
126                 xhr.onreadystatechange = function() {
127                     if (xhr.readyState == 4 && xhr.status == 200) {
128                         res = xhr.responseText;
129                         success(res);
130                     }
131                 }
132                 xhr.open(type, url, async);
133                 xhr.send(send);
134         }
135     },
136     /**
137     *Array 数组相关
138     */
139     array : {
140         minIndex : function(ary){
141             return Math.min.apply(null,ary);    
142         },
143         maxitem : function(ary){
144             return Math.max.apply(null,ary);
145         }
146     },
147     /**
148     *Client 客户端检测
149     */
150     client : function(){
151         // 浏览器渲染引擎 engines
152         var engine = {            
153             ie: 0,
154             gecko: 0,
155             webkit: 0,
156             khtml: 0,
157             opera: 0,
158 
159             //complete version
160             ver: null  
161         };
162         
163         // 浏览器
164         var browser = {
165             //browsers
166             ie: 0,
167             firefox: 0,
168             safari: 0,
169             konq: 0,
170             opera: 0,
171             chrome: 0,
172             //specific version
173             ver: null
174         };
175         
176         // 客户端平台platform/device/OS
177         var system = {
178             win: false,
179             mac: false,
180             x11: false,
181             
182             //移动设备
183             iphone: false,
184             ipod: false,
185             ipad: false,
186             ios: false,
187             android: false,
188             nokiaN: false,
189             winMobile: false,
190             
191             //game systems
192             wii: false,
193             ps: false 
194         };    
195 
196         // 检测浏览器引擎
197         var ua = navigator.userAgent;    
198         if (window.opera){
199             engine.ver = browser.ver = window.opera.version();
200             engine.opera = browser.opera = parseFloat(engine.ver);
201         } else if (/AppleWebKit\/(\S+)/.test(ua)){
202             engine.ver = RegExp["$1"];
203             engine.webkit = parseFloat(engine.ver);
204             
205             //figure out if it's Chrome or Safari
206             if (/Chrome\/(\S+)/.test(ua)){
207                 browser.ver = RegExp["$1"];
208                 browser.chrome = parseFloat(browser.ver);
209             } else if (/Version\/(\S+)/.test(ua)){
210                 browser.ver = RegExp["$1"];
211                 browser.safari = parseFloat(browser.ver);
212             } else {
213                 //approximate version
214                 var safariVersion = 1;
215                 if (engine.webkit < 100){
216                     safariVersion = 1;
217                 } else if (engine.webkit < 312){
218                     safariVersion = 1.2;
219                 } else if (engine.webkit < 412){
220                     safariVersion = 1.3;
221                 } else {
222                     safariVersion = 2;
223                 }   
224                 
225                 browser.safari = browser.ver = safariVersion;        
226             }
227         } else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){
228             engine.ver = browser.ver = RegExp["$1"];
229             engine.khtml = browser.konq = parseFloat(engine.ver);
230         } else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){    
231             engine.ver = RegExp["$1"];
232             engine.gecko = parseFloat(engine.ver);
233             
234             //determine if it's Firefox
235             if (/Firefox\/(\S+)/.test(ua)){
236                 browser.ver = RegExp["$1"];
237                 browser.firefox = parseFloat(browser.ver);
238             }
239         } else if (/MSIE ([^;]+)/.test(ua)){    
240             engine.ver = browser.ver = RegExp["$1"];
241             engine.ie = browser.ie = parseFloat(engine.ver);
242         }
243         
244         //detect browsers
245         browser.ie = engine.ie;
246         browser.opera = engine.opera;
247         
248 
249         //detect platform
250         var p = navigator.platform;
251         system.win = p.indexOf("Win") == 0;
252         system.mac = p.indexOf("Mac") == 0;
253         system.x11 = (p == "X11") || (p.indexOf("Linux") == 0);
254 
255         //detect windows operating systems
256         if (system.win){
257             if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){
258                 if (RegExp["$1"] == "NT"){
259                     switch(RegExp["$2"]){
260                         case "5.0":
261                             system.win = "2000";
262                             break;
263                         case "5.1":
264                             system.win = "XP";
265                             break;
266                         case "6.0":
267                             system.win = "Vista";
268                             break;
269                         case "6.1":
270                             system.win = "7";
271                             break;
272                         default:
273                             system.win = "NT";
274                             break;                
275                     }                            
276                 } else if (RegExp["$1"] == "9x"){
277                     system.win = "ME";
278                 } else {
279                     system.win = RegExp["$1"];
280                 }
281             }
282         }
283         
284         //mobile devices
285         system.iphone = ua.indexOf("iPhone") > -1;
286         system.ipod = ua.indexOf("iPod") > -1;
287         system.ipad = ua.indexOf("iPad") > -1;
288         system.nokiaN = ua.indexOf("NokiaN") > -1;
289         
290         //windows mobile
291         if (system.win == "CE"){
292             system.winMobile = system.win;
293         } else if (system.win == "Ph"){
294             if(/Windows Phone OS (\d+.\d+)/.test(ua)){;
295                 system.win = "Phone";
296                 system.winMobile = parseFloat(RegExp["$1"]);
297             }
298         }
299 
300         //determine iOS version
301         if (system.mac && ua.indexOf("Mobile") > -1){
302             if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)){
303                 system.ios = parseFloat(RegExp.$1.replace("_", "."));
304             } else {
305                 system.ios = 2;  //can't really detect - so guess
306             }
307         }
308         
309         //determine Android version
310         if (/Android (\d+\.\d+)/.test(ua)){
311             system.android = parseFloat(RegExp.$1);
312         }
313         
314         //gaming systems
315         system.wii = ua.indexOf("Wii") > -1;
316         system.ps = /playstation/i.test(ua);
317         
318         //return it
319         return {
320             engine:     engine,
321             browser:    browser,
322             system:     system        
323         };
324 
325     }(),
326     /**
327     *Tween 缓动相关
328     */
329     tween: {
330         Linear: function(t, b, c, d) {
331             return c * t / d + b;
332         },
333         Quad: {
334             easeIn: function(t, b, c, d) {
335                 return c * (t /= d) * t + b;
336             },
337             easeOut: function(t, b, c, d) {
338                 return - c * (t /= d) * (t - 2) + b;
339             },
340             easeInOut: function(t, b, c, d) {
341                 if ((t /= d / 2) < 1) return c / 2 * t * t + b;
342                 return - c / 2 * ((--t) * (t - 2) - 1) + b;
343             }
344         },
345         Cubic: {
346             easeIn: function(t, b, c, d) {
347                 return c * (t /= d) * t * t + b;
348             },
349             easeOut: function(t, b, c, d) {
350                 return c * ((t = t / d - 1) * t * t + 1) + b;
351             },
352             easeInOut: function(t, b, c, d) {
353                 if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;
354                 return c / 2 * ((t -= 2) * t * t + 2) + b;
355             }
356         },
357         Quart: {
358             easeIn: function(t, b, c, d) {
359                 return c * (t /= d) * t * t * t + b;
360             },
361             easeOut: function(t, b, c, d) {
362                 return - c * ((t = t / d - 1) * t * t * t - 1) + b;
363             },
364             easeInOut: function(t, b, c, d) {
365                 if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;
366                 return - c / 2 * ((t -= 2) * t * t * t - 2) + b;
367             }
368         },
369         Quint: {
370             easeIn: function(t, b, c, d) {
371                 return c * (t /= d) * t * t * t * t + b;
372             },
373             easeOut: function(t, b, c, d) {
374                 return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
375             },
376             easeInOut: function(t, b, c, d) {
377                 if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
378                 return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
379             }
380         },
381         Sine: {
382             easeIn: function(t, b, c, d) {
383                 return - c * Math.cos(t / d * (Math.PI / 2)) + c + b;
384             },
385             easeOut: function(t, b, c, d) {
386                 return c * Math.sin(t / d * (Math.PI / 2)) + b;
387             },
388             easeInOut: function(t, b, c, d) {
389                 return - c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
390             }
391         },
392         Expo: {
393             easeIn: function(t, b, c, d) {
394                 return (t == 0) ? b: c * Math.pow(2, 10 * (t / d - 1)) + b;
395             },
396             easeOut: function(t, b, c, d) {
397                 return (t == d) ? b + c: c * ( - Math.pow(2, -10 * t / d) + 1) + b;
398             },
399             easeInOut: function(t, b, c, d) {
400                 if (t == 0) return b;
401                 if (t == d) return b + c;
402                 if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
403                 return c / 2 * ( - Math.pow(2, -10 * --t) + 2) + b;
404             }
405         },
406         Circ: {
407             easeIn: function(t, b, c, d) {
408                 return - c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
409             },
410             easeOut: function(t, b, c, d) {
411                 return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;
412             },
413             easeInOut: function(t, b, c, d) {
414                 if ((t /= d / 2) < 1) return - c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
415                 return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
416             }
417         },
418         Elastic: {
419             easeIn: function(t, b, c, d, a, p) {
420                 if (t == 0) return b;
421                 if ((t /= d) == 1) return b + c;
422                 if (!p) p = d * .3;
423                 if (!a || a < Math.abs(c)) {
424                     a = c;
425                     var s = p / 4;
426                 } else var s = p / (2 * Math.PI) * Math.asin(c / a);
427                 return - (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
428             },
429             easeOut: function(t, b, c, d, a, p) {
430                 if (t == 0) return b;
431                 if ((t /= d) == 1) return b + c;
432                 if (!p) p = d * .3;
433                 if (!a || a < Math.abs(c)) {
434                     a = c;
435                     var s = p / 4;
436                 } else var s = p / (2 * Math.PI) * Math.asin(c / a);
437                 return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b);
438             },
439             easeInOut: function(t, b, c, d, a, p) {
440                 if (t == 0) return b;
441                 if ((t /= d / 2) == 2) return b + c;
442                 if (!p) p = d * (.3 * 1.5);
443                 if (!a || a < Math.abs(c)) {
444                     a = c;
445                     var s = p / 4;
446                 } else var s = p / (2 * Math.PI) * Math.asin(c / a);
447                 if (t < 1) return - .5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
448                 return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
449             }
450         },
451         Back: {
452             easeIn: function(t, b, c, d, s) {
453                 if (s == undefined) s = 1.70158;
454                 return c * (t /= d) * t * ((s + 1) * t - s) + b;
455             },
456             easeOut: function(t, b, c, d, s) {
457                 if (s == undefined) s = 1.70158;
458                 return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
459             },
460             easeInOut: function(t, b, c, d, s) {
461                 if (s == undefined) s = 1.70158;
462                 if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
463                 return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
464             }
465         },
466         Bounce: {
467             easeIn: function(t, b, c, d) {
468                 return c - Tween.Bounce.easeOut(d - t, 0, c, d) + b;
469             },
470             easeOut: function(t, b, c, d) {
471                 if ((t /= d) < (1 / 2.75)) {
472                     return c * (7.5625 * t * t) + b;
473                 } else if (t < (2 / 2.75)) {
474                     return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
475                 } else if (t < (2.5 / 2.75)) {
476                     return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
477                 } else {
478                     return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
479                 }
480             },
481             easeInOut: function(t, b, c, d) {
482                 if (t < d / 2) return Tween.Bounce.easeIn(t * 2, 0, c, d) * .5 + b;
483                 else return Tween.Bounce.easeOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
484             }
485         }
486     }
487 
488 }

 

posted @ 2015-04-10 14:46  helloZou  阅读(286)  评论(0编辑  收藏  举报