|
/*!
* 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);
|