123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- /*!
- * Squid 总结、积累、收集的一些基础方法
- * http://www.cnblogs.com/typeof/
- *
- * 所有plugins、swing所做的扩展都是基于Squid对象
- */
- (function(window) {
- //定义squid
- var Squid = function() {},
- slice = Array.prototype.slice,
- splice = Array.prototype.splice,
- trim = String.prototype.trim;
- //浅度拷贝
- Squid.extend = function() {
- var target = arguments[0],
- i = 1,
- length = arguments.length,
- options,
- prop;
- if(typeof target !== 'object') {
- target = {};
- }
- if(length === i) {
- target = this;
- --i;
- }
- for(; i < length; i++) {
- if((options = arguments[i]) != null) {
- for(prop in options) {
- target[prop] = options[prop];
- }
- }
- }
- return target;
- };
- //DOM 方法
- Squid.extend({
- getElementById: function(id) {
- var elem = document.getElementById(id);
-
- if(elem && elem.parentNode) {
- if(elem.id !== id) {
- elem = null;
- var elems = document.getElementsByTagName(id),
- i = 0,
- length = elems.length,
- cur;
- for(; i < length; i++) {
- cur = elems[i];
- if(cur.id === id) {
- elem = cur;
- break;
- }
- }
- }
-
- return elem;
- }
- },
- getElementsByTagName: function(tagName, context) {
- context = context || document;
- var elems = context.getElementsByTagName(tagName),
- r = [];
-
- try {
- r = slice.call(elems, 0);
- }catch(e) {
- var i = 0,
- length = elems.length,
- elem;
- for(; i < length; i++) {
- elem = elems[i];
- r.push(elem);
- }
- }
- return r;
- },
- getElementsByClassName: function(className, context) {
- //执行上下文,默认为document
- context = context || document;
- var r = [];
- if(context.getElementsByClassName) {
- var elems = context.getElementsByClassName(className);
- r = slice.call(elems, 0);
- }else{
- var elems,
- elem,
- i = 0,
- length;
- elems = context.getElementsByTagName('*');
- length = elems.length;
- for(; i < length; i++) {
- elem = elems[i];
- if(elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(className) >= 0) {
- r.push(elem);
- }
- }
- }
- return r;
- },
- children: function(elem) {
- },
- first: function(elem) {
- return this.sibling(elem.firstChild)[0];
- },
- next: function(elem) {
- return this.nth(elem, 2, 'nextSibling');
- },
- siblings: function(elem) {
- return this.sibling(elem.parentNode.firstChild, elem);
- },
- nth: function(cur, r, dir) {
- r = r || 1;
- var i = 0;
- for(; cur; cur = cur[dir]) {
- if(cur.nodeType === 1 && ++i === r) {
- break;
- }
- }
- return cur;
- },
- sibling: function(n, elem) {
- var r = [];
- for(; n; n = n.nextSibling) {
- if(n.nodeType === 1 && n !== elem) {
- r.push(n);
- }
- }
- return r;
- },
- isVisible: function(elem) {
- return !this.isHidden(elem);
- },
- isHidden: function(elem) {
- if(elem) {
- var width = elem.offsetWidth,
- height = elem.offsetHeight;
- return (width === 0 && height === 0) || elem.style.display === 'none'
- }
- },
- getOffset: function(elem) {
- var body = document.body,
- docElem = document.documentElement;
- if('getBoundingClientRect' in document.documentElement) {
- var box;
- try {
- box = elem.getBoundingClientRect()
- }catch(e) {}
- if(!box || !elem.parentNode) {
- return box ? {top: box.top, left: box.left} : {top: 0, left: 0}
- }
- var win = window,
- clientTop = docElem.clientTop || body.clientTop || 0,
- clientLeft = docElem.clientLeft || body.clientLeft || 0,
- scrollTop = win.pageYOffset || docElem.scrollTop || body.scrollTop,
- scrollLeft = win.pageXOffset || docElem.scrollLeft || body.scrollLeft,
- top = box.top + scrollTop - clientTop,
- left = box.left + scrollLeft - clientLeft;
- return {top: top, left: left}
- }else{
- var offsetParent = elem.offsetParent,
- top = elem.offsetTop,
- left = elem.offsetLeft;
- while((elem = elem.parentNode) && elem !== body && elem !== docElem) {
- if(elem === offsetParent) {
- top = elem.offsetTop
- left = elem.offsetLeft
- offsetParent = elem.offsetParent
- }
- }
- return {top: top, left: left}
- }
- },
- position: function(elem) {
- if(!elem) {
- return null;
- }
- var offsetParent = elem.offsetParent,
- offset = this.getOffset(elem),
- parentOffset = this.getOffset(offsetParent);
- return {
- top: offset.top - parentOffset.top,
- left: offset.left - parentOffset.left
- };
- }
- });
-
- //全局缓存对象
- var cache = {};
- Squid.extend({
- guid: 1,
- uuid: 0,
- expando: 'squid' + (Math.random() + '').replace(/\D/g, ''),
- data: function(elem, name) {
- var internalKey = squid.expando,
- id,
- thisCache,
- r;
- id = elem[squid.expando];
- if(!id) {
- elem[squid.expando] = id = ++squid.uuid;
- }
- if(!cache[id]) {
- cache[id] = {};
- }
- if(typeof name === 'object' || typeof name === 'function') {
- cache[id][internalKey] = name;
- }
- thisCache = cache[id];
- if(!thisCache[internalKey]) {
- thisCache[internalKey] = {};
- }
- thisCache = thisCache[internalKey];
- if(name === 'events' && !thisCache[name]) {
- return thisCache[internalKey] && thisCache[internalKey].events;
- }
- if(typeof name === 'string') {
- r = thisCache[name];
- }else{
- r = thisCache;
- }
- return r;
- },
- removeData: function(elem, name) {
- var internalKey = squid.expando,
- id = elem[squid.expando],
- internalCache;
- if(!cache[id]) {
- return;
- }
- try{
- delete cache[id];
- }catch(e) {
- cache[id] = null;
- }
- if(elem.removeAttribute) {
- elem.removeAttribute(squid.expando);
- }else{
- elem[squid.expando] = null;
- }
- }
- });
- //事件处理
- Squid.event = {
- add: function(elem, type, handler) {
- var elemData,
- events,
- eventHandler,
- handleObj,
- handlers;
- if(elem.nodeType === 3 || elem.nodeType === 8) {
- return;
- }
- if(!handler) {
- return;
- }
- if(!handler.guid) {
- handler.guid = squid.guid++;
- }
- elemData = squid.data(elem);
- if(!elemData) {
- return;
- }
- events = elemData.events;
- eventHandler = elemData.handle;
- if(!events) {
- elemData.events = events = {};
- }
- if(!eventHandler) {
- elemData.handle = eventHandler = function(event) {
- return squid.event.handle.apply(eventHandler.elem, arguments);
- };
- eventHandler.elem = elem;
- }
-
- handleObj = {
- handler: handler
- };
- handleObj.type = type;
- if(!handleObj.guid) {
- handleObj.guid = handler.guid;
- }
- handlers = events[type];
- if(!handlers) {
- handlers = events[type] = [];
- if(elem.addEventListener) {
- elem.addEventListener(type, eventHandler, false);
- }else if(elem.attachEvent){
- elem.attachEvent('on' + type, eventHandler);
- }
- }
- handlers.push(handleObj);
- },
- remove: function(elem, type, handler) {
- var elemData,
- events,
- eventType,
- i = 0,
- handleObj;
-
- if(elem.nodeType === 3 || elem.nodeType === 8) {
- return;
- }
-
- elemData = squid.data(elem);
- events = elemData.events;
- if(!events) {
- return;
- }
- eventType = events[type] || [];
- if(!handler) {
- for(; i < eventType.length; i++) {
- handleObj = eventType[i];
- squid.event.remove(elem, type, handleObj.handler);
- eventType.splice(i--, 1);
- }
- }
-
- if(eventType.length === 0) {
- if(elem.removeEventListener) {
- elem.removeEventListener(type, elemData.handle, false);
- }else if(elem.detachEvent) {
- elem.detachEvent('on' + type, elemData.handle);
- }
- }
-
- squid.removeData(elem);
- },
- handle: function(event) {
- var i = 0,
- length,
- handlers,
- handleObj,
- args = Array.prototype.slice.call(arguments, 0);
- event = squid.event.fix(event);
- handlers = ((squid.data(this, 'events') || {})[event.type] || []).slice(0);
- args[0] = event;
- length = handlers.length;
- for(; i < length; i++) {
- handleObj = handlers[i];
- event.handler = handleObj.handler;
- event.handleObj = handleObj;
- handleObj.handler.apply(this, args);
- }
- },
- fix: function(event) {
- if(!event.target) {
- event.target = event.srcElement || document;
- }
- if(event.target.nodeType === 3) {
- event.target = event.target.parentNode;
- }
-
- if(!event.relateTarget && event.fromElement) {
- event.relateTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
- }
- if(!event.preventDefault) {
- event.preventDefault = function() {
- event.returnValue = false;
- };
- }
- if(!event.stopPropagation) {
- event.stopPropagation = function() {
- event.cancelBubble = true;
- };
- }
-
- if(event.pageX == null) {
- var eventDoc = event.target.ownerDocument || document,
- doc = eventDoc.documentElment,
- body = eventDoc.body;
-
- event.pageX = event.clientX + (doc && document.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
- event.pageY = event.clientY + (doc && document.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
- }
- return event;
- }
- };
- //事件处理
- Squid.extend({
- on: function(elem, type, handler) {
- return this.event.add(elem, type, handler);
- },
- off: function(elem, type, handler) {
- return this.event.remove(elem, type, handler);
- },
- //把函数放到特定上下文执行
- proxy: function(fn, context) {
- var slice = Array.prototype.slice,
- args = slice.call(arguments, 2),
- proxy = function() {
- return fn.apply(context, args.concat(slice.call(arguments)));
- };
- proxy.guid = fn.guid = fn.guid || proxy.guid || squid.guid++;
- return proxy;
- }
- });
- var fnThrottleId = 0;
- //工具函数
- Squid.extend({
- trim: trim ? function(text) {
- return trim.call(text);
- } : function(text) {
- return text.toString().replace(/^\s+/, '').replace(/\s+$/, '');
- },
- throttle: function(fn, delay, context) {
- delay = delay || 100;
- context = context || null;
-
- return function() {
- var args = arguments;
-
- clearTimeout(fnThrottleId);
- fnThrottleId = setTimeout(function() {
- fn.apply(context, args);
- }, delay);
- };
- },
- isEmpty: function(obj) {
- for(var prop in obj) {
- return false;
- }
-
- return true;
- }
- });
- //基于Squid扩展的插件
- Squid.plugin = function() {};
- //解决浏览器对默认组件渲染不一样
- Squid.swing = function() {};
- window.squid = Squid;
- })(window);
|