微型类库g

好久没来更新了,最近工作换的频繁,依旧浮躁啊!这年头安心搞搞技术也不容易。

现在公司比较闲整理了以前的代码公共方法库和弹出层。

先把整理后的公共方法库放上来(以备忘),结构非常简单甚至简陋,功能上面几乎没太大的变化,主要是使用方法比以前简单,搞得跟jquery的api差不多,支持简单的链式操作。把所有方法和属性都挂在g这个对象上了,至于为什么取名为g,一则因为命名短而不又想用$,二则取原来的getEl方法的首字母。

ps:发现金蝶的公用库也是用getEl作选择器函数名(哎,错过金蝶的面试有点痛心)。

废话就这么多,下面是代码,相信这么易懂的函数库不需要api文档那么复杂吧!况且里面还是有些简短的注释。如确实有不明白可以跟帖提问

使用方法:

g('#test').children().each(function(){
alert(
this.nodeName);
});
g.xhr('loadUrl','abc.txt',function(data){
    var json = eval('('+data+')'),str='',nl;
    nl = json.nodeList;
    for(var i=0,len=nl.length;i<len;i++){
        str += '<p><strong>'+i+'.'+nl[i].p+'</strong></p>';
    }
    g('#result').html(str);
});
//g()选择器返回包装后的对象,目前仍然只支持id/css/tagName,children()暂不接受参数返回包装后的对象,并改变当前对象的dom元素,
//each函数可以用来循环输出选择后的dom元素列表或者是数组对象
//xhr创建ajax对象,第一个参数可以loadUrl为get方法,或者是postData使用post方式,第二个参数为url,第三个为回调方法,第四个参数为post的数据。

g.js原代码:

/*
author:hot
createDate:2010-10-11
update:2011-8-30
JavaScript simple library
*/
(function(window,undefined){
	var g=function(selecter){//简易类库
		if(!(this instanceof g))
			return new g(selecter);
		if(selecter instanceof g)
			return selecter;
		this.dom=selecter?this.init(selecter):[];//原生dom元素
		this.length=this.dom.length;
		return this;
	};
	g.info={
		create:"2010-10-11",
		modify:"2011-08-30",
		version:"1.0.1"
	};
	g.prototype={
		init:function(selecter){//简易选择器,可以选择id,css,tag标签
			switch(typeof selecter){
				case 'string':
					if(/^#([\w-]+)$/.test(selecter))//匹配id选择器
						return [document.getElementById(selecter.replace('#',''))];
					else if(/^\.([\w-]+)$/.test(selecter)){//匹配css选择器,返回数组集合
						if(document.getElementsByClassName)
							return document.getElementsByClassName(selecter.replace('.',''));
						else{//以下兼容ie5.5
							var allEl=document.all?document.all:document.documentElement.getElementsByTagName("*"),result=[];
							for(var i=0,len=allEl.length;i-1)
									result.push(allEl[i]);
							}
							return result;
						}
					}else if(/^([\w-]+)$/.test(selecter)){//匹配标签选择器
						var els = document.getElementsByTagName(selecter).length==0?[]:document.getElementsByTagName(selecter);
						return els;
					}else
						return [];
				case 'object'://对象直接返回
					return selecter.length?selecter:[selecter];
				default:return [];
			}
		},
		each:function(fun){//循环
			if(!g.isFunction(fun))return ;
			if(this.dom.length){
				for(var i=0,len=this.dom.length;i0;
		},
		addEvent:function(type,fn){ //绑定事件
			this.each(function(){
				g.event().add(this,type,fn);
			});
		},
		removeEvent:function(type,fn){//移除绑定
			this.each(function(){
				g.event().remove(this,type,fn);
			});
		},
		hover:function(fnOver, fnOut){//鼠标滑过函数
			if(!g.isFunction(fnOver)||!g.isFunction(fnOut))return ;
			this.addEvent('mouseover',fnOver);
			this.addEvent('mouseout',fnOut);
		},
		position:function(){//dom节点的绝对位置
			if(this.dom[0]&&this.dom[0].nodeType == 1){
				var left = 0, top = 0, right = 0, bottom = 0;
				//ie8的getBoundingClientRect获取不准确
				if ( !this.dom[0].getBoundingClientRect || g.browser.ie8 ) {
					var n = this.dom[0];
					while (n) { left += n.offsetLeft, top += n.offsetTop; n = n.offsetParent; };
					right = left + n.offsetWidth; bottom = top + n.offsetHeight;
				} else {
					var rect = this.dom[0].getBoundingClientRect();
					left = right = g.getScrollLeft(this.dom[0]); top = bottom = g.getScrollTop(this.dom[0]);
					left += rect.left; right += rect.right;
					top += rect.top; bottom += rect.bottom;
				};
				return { "left": left, "top": top, "right": right, "bottom": bottom };
			}
		},
		css:function(){//设置当前样式属性
			var str0=arguments[0],str1=arguments[1];
			if(arguments.length==1&&g.isString(str0)){
				return g.style(this.dom[0],str0);
			}else if(arguments.length==1&&typeof(str0)=='object'){
				for(var name in str0){
					g.style(this.dom[0],name,str0[name]);
				}
			}else if(arguments.length==2&&g.isString(str0)&&g.isString(str1)){
				g.style(this.dom[0],str0,str1);
			}
			return this;
		},
		size:function() {//获取元素的宽高,包括隐藏元素的
			var dom=this.dom[0];
			var width = dom.offsetWidth, height = dom.offsetHeight;
			if ( !width && !height ) {
				var clone=dom.cloneNode(false);
				dom.parentNode.appendChild(clone);
				var style = clone.style;
				var cssShow ="position:absolute;visibility:hidden;display:block;left:-9999px;top:-9999px;";
				//var cssBack ="position:"+style.position+";visibility:"+style.visibility+";display:"+style.display+";left:"+style.left+";top:"+style.top;
				clone.style.cssText=cssShow;
				width = clone.offsetWidth; height = clone.offsetHeight;
				dom.parentNode.removeChild(clone);
			}
			return { "width": width, "height": height };
		},
		remove:function(elem){//移除内部的元素,也可以是自己本身
			var self=this;
			if(!elem){
				self.each(function(){
					this.parentNode.removeChild(this);
				});
				this.dom = [];
				return this;
			}
			if(g(elem).dom.length){
				self.each(function(){
					var me = this;
					g(elem).each(function(){
						if(g(me).has(this))
							this.parentNode.removeChild(this);
					});	
				});
			}
			return this;
		}
	};
	g.prototype.extend = g.extend = function() {
		var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
		if ( typeof target === "boolean" ) {
			deep = target;
			target = arguments[1] || {};
			i = 2;
		}
		if ( typeof target !== "object" && !g.isFunction(target) ) {
			target = {};
		}
		if ( length === i ) {
			target = this;
			--i;
		}
		for ( ; i < length; i++ ) {
			if ( (options = arguments[i]) != null ) {
				for ( name in options ) {
					src = target[name];
					copy = options[name];
					if ( target === copy ) {
						continue;
					}
					if ( deep && copy && g.isArray(copy) ) {
						var clone = src && ( g.isArray(src) )?src:g.isArray(copy) ? [] : {};
						target[ name ] = g.extend( deep, clone, copy );
					} else if ( copy !== undefined ) {
						target[ name ] = copy;
					}
				}
			}
		}
		return target;
	};
	g.extend({
		style:function(el,name,value){
			var set=value!==undefined;
			if(name=='width'||name=='height'&&parseFloat(value)<0)value=undefined;
			if(name=='opacity'&&g.browser.msie){
				if(set){
					el.style.zoom=1;
					var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
					el.style.filter = opacity;
				}
				return el.style.filter&&el.style.filter.indexOf("opacity=") >= 0 ?
				(parseFloat( /opacity=([^)]*)/.exec(el.style.filter)[1] ) / 100) + "":
				"";
			}
			if(set){
				el.style[name]=value;
			}else{
				return getStyle(el,name);
			}
			function getStyle(elem,styleName){//获取当前样式属性
				if(elem.currentStyle)//ie
					return styleName?elem.currentStyle[styleName]:elem.currentStyle;
				else{ //webkit
					var arr=elem.ownerDocument.defaultView.getComputedStyle(elem, null);
					return styleName?arr[styleName]:arr;
				}
			}
		},
		stopEvent:function(e){//阻止触发默认事件
			e = e || window.event;
			if(e.preventDefault) {
				e.preventDefault();
				e.stopPropagation();
			}else{
				e.returnValue = false;
				e.cancelBubble = true;
			}
		},
		getScrollTop:function(node) {//获取页面上节点实际位置top
			var doc = node ? node.ownerDocument : document;
			return doc.documentElement.scrollTop || doc.body.scrollTop;
		},
		getScrollLeft:function(node) {//获取页面上节点实际位置left
			var doc = node ? node.ownerDocument : document;
			return doc.documentElement.scrollLeft || doc.body.scrollLeft;
		},
		cancelBubble:function(e){//阻止事件冒泡
			e = e || window.event;
			e.stopPropagation?e.stopPropagation():e.cancelBubble = true;
		},
		stopSelect:function(){//阻止浏览器默认选取
			window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();
		},
		event:function(){//原生事件兼容处理
			var add,remove,guid = 1,base={};
			add = function( element, type, handler ) {
				if ( type === 'DOMContentLoaded' || type === 'ready' ) {
					g.ready( handler );
					return;
				}
				if ( element.addEventListener ) {
					element.addEventListener( type, handler, false );
				} else {
					if ( !handler.$$guid ) { handler.$$guid = guid++; }
					if ( !element.events ) { element.events = {}; }
					var handlers = element.events[ type ];
					if ( !handlers ) {
						handlers = element.events[ type ] = {};
						if ( element[ 'on' + type ] ) {
							handlers[0] = element[ 'on' + type ];
						}
					}
					handlers[ handler.$$guid ] = handler;
					element[ 'on' + type ] = handleEvent;
				}
			};
			remove = function( element, type, handler ) {
				if ( element.removeEventListener ) {
					element.removeEventListener(type, handler, false);
				} else {
					if ( element.events && element.events[ type ] ) {
						delete element.events[type][handler.$$guid];
					}
				}
			};
			function handleEvent() {
				var returnValue = true, event = fixEvent();
				var handlers = this.events[ event.type ];
				for ( var i in handlers ) {
					this.$$handleEvent = handlers[ i ];
					if ( this.$$handleEvent( event ) === false ) {
						returnValue = false;
					}
				}
				return returnValue;
			}
			function fixEvent( event ) {
				if(event) return event;
				event = ((this.ownerDocument || this.document || this).parentWindow || window).event;
				(function( calc ) {
					event.pageX = event.clientX + calc('Left');
					event.pageY = event.clientY + calc('Top');
				})(function( side ) {
					return ( base['scroll' + side] || 0) - (base['client' + side] || 0 );
				});
				event.target = event.srcElement;
				switch ( event.type ) {
					case 'mouseout':
						event.relatedTarget = event.toElement;
					case 'mouseover':
						event.relatedTarget = event.fromElement;
				};
				return event;
			};
			return {
				'add': add,
				'remove': remove,
				'fixEvent': fixEvent
			};
		},
		forEach:function(arr,fun){
			if(!g.isFunction(fun))return ;
			if(g.isArray(arr)){
				for(var i=0,len=arr.length;i)[^\t]*)'/g, "$1\r")
				  .replace(/\t=(.*?)%>/g, "',$1,'")
				  .split("\t").join("');")
				  .split("%>").join("p.push('")
				  .split("\r").join("\\'")
			  + "');}return p.join('');");
			return data ? fn( data ) : fn;
		};
	})();
	try{
		document.execCommand("BackgroundImageCache", false, true);
	}catch(e){}
	window.getEl = window.g = g;
})(window);

posted @ 2011-04-18 17:34  冰封e族  阅读(397)  评论(1编辑  收藏  举报