`
石不易
  • 浏览: 7737 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

【JavaScript 封装库】BETA 2.0 测试版发布!

阅读更多

 

/*
	源码作者: 石不易(Louis Shi)
	联系方式: http://www.shibuyi.net
	===================================================================================
	程序名称: JavaScript 封装库 BETA 2.0 版
	迭代版本: BETA 1.0
	功能总数: 50 个
	新增总数: 6 个
	删除总数: 0 个
	追加功能: 
		1. 库方法: 设置与获取滚动条
		2. 库方法: 定位器筛选
		3. 库方法: 检测元素从属关系(直接从属)
		4. 库方法: 获取网页可视区尺寸
		5. 库方法: 禁止页面滚动(修正浏览器BUG)
		...
	优化功能: 
		1. 取消了“隶属方法”, 增加了“库方法”并与“特效”和“事件”组成集合, 封装库结构更加清晰
		2. 元素节点获取更加智能, 支持 class / name / tagName / id 在内的局部搜索
		3. 添加与删除元素节点更加方便容易, 支持 class / name / tagName / id 直接定位
		...
	删除功能: 
		无
*/

// 实例化封装库
function $(_this) {
	return new Base(_this);
}

// 封装库构造方法
function Base(_this) {
	this.elements = [];
	if (typeof _this == 'object' && _this !== null) this.elements.push(_this);
}

// 获取元素节点
Base.prototype.getNodes = function () {
	if (this.elements.length == 0) return '没有任何节点对象';
	if (this.elements.length == 1) return this.elements[0];
	return this.elements;
};

// 获取 id 元素节点
Base.prototype.getId = function (ids) {
	if (ids instanceof Array) { // 集群
		for (var i in ids) {
			this.getId(ids[i]);
		}
	} else { // 单个
		var node = document.getElementById(ids);
		if (node === null) return this;
		for (var i =0; i < this.elements.length; i ++) {
			if (this.elements[i] == node) return this;
		}
		this.elements.push(node);
	}
	return this;
};

// 获取 name 元素节点
Base.prototype.getName = function (name, position) {
	var nodes = [], selector = [];
	if (typeof position != 'undefined') { // 局部
		selector = Base.positioner(position);
		if (selector instanceof Array) { // 集群
			for (var i = 0; i < selector.length; i ++) {
				nodes.push(selector[i].getElementsByTagName('*'));
			}
		} else { // 单个
			if (typeof selector == 'object') nodes = selector.getElementsByTagName('*'); // 防止 IE 无法识别 name 属性
		}
	} else { // 全局
		nodes = document.getElementsByName(name);
	}
	for (var i = 0; i < nodes.length; i ++) {
		if (typeof nodes[i].length != 'undefined' && typeof nodes[i].item != 'undefined') { // 多集群
			for (var j = 0; j < nodes[i].length; j ++) {
				if (nodes[i][j].getAttribute('name') == name) this.elements.push(nodes[i][j]);
			}
		} else { // 单集群
			if (nodes[i].getAttribute('name') == name) this.elements.push(nodes[i]);
		}
	}
	return this;
};

// 获取 tagName 元素节点
Base.prototype.getTagName = function (tagName, position) {
	var nodes = [], selector = [];
	if (typeof position != 'undefined') { // 局部
		selector = Base.positioner(position);
		if (selector instanceof Array) { // 集群
			for (var i = 0; i < selector.length; i ++) {
				nodes.push(selector[i].getElementsByTagName(tagName));
			}
		} else { // 单个
			if (typeof selector == 'object') nodes = selector.getElementsByTagName(tagName); // 防止 IE 无法识别 name 属性
		}
	} else { // 全局
		nodes = document.getElementsByTagName(tagName);
	}
	for (var i = 0; i < nodes.length; i ++) {
		if (typeof nodes[i].length != 'undefined' && typeof nodes[i].item != 'undefined') { // 多集群
			for (var j = 0; j < nodes[i].length; j ++) {
				this.elements.push(nodes[i][j]);
			}
		} else { // 单集群
			this.elements.push(nodes[i]);
		}
	}
	return this;
};

// 获取 class 元素节点
Base.prototype.getClass = function (className, position) {
	var nodes = [], selector = [];
	if (typeof position != 'undefined') { // 局部
		selector = Base.positioner(position);
		if (selector instanceof Array) { // 集群
			for (var i = 0; i < selector.length; i ++) {
				nodes.push(selector[i].getElementsByTagName('*'));
			}
		} else { // 单个
			if (typeof selector == 'object') nodes = selector.getElementsByTagName('*'); // 防止 IE 无法识别 name 属性
		}
	} else { // 全局
		nodes = $().getTagName('*').getNodes();
	}
	for (var i = 0; i < nodes.length; i ++) {
		if (typeof nodes[i] == 'undefined') continue; // 兼容 IE 识别空元素
		if (typeof nodes[i].length != 'undefined' && typeof nodes[i].item != 'undefined') { // 多集群
			for (var j = 0; j < nodes[i].length; j ++) {
				if (Base.hasClass(nodes[i][j], className)) this.elements.push(nodes[i][j]);
			}
		} else { // 单集群
			if (Base.hasClass(nodes[i], className)) this.elements.push(nodes[i]);
		}
	}
	return this;
};

// 获取与设置 innerHTML
Base.prototype.html = function (text) {
	if (typeof text != 'undefined') { // 设置
		for (var i = 0; i < this.elements.length; i ++) {
			this.elements[i].innerHTML = text;
		}
	} else { // 获取
		var html = [];
		for (var i = 0; i < this.elements.length; i ++) {
			html.push(this.elements[i].innerHTML);
		}
		if (html.length == 1) return html[0];
		return html;
	}
	return this;
};

// 获取与设置 value (表单)
Base.prototype.value = function (text) {
	if (typeof text != 'undefined') { // 设置
		for (var i = 0; i < this.elements.length; i ++) {
			if (typeof this.elements[i].value != 'undefined') this.elements[i].value = text;
		}
	} else { // 获取
		var value = [];
		for (var i = 0; i < this.elements.length; i ++) {
			if (typeof this.elements[i].value != 'undefined') value.push(this.elements[i].value);
		}
		if (value.length == 1) return value[0];
		return value;
	}
	return this;
};

// 获取与设置 CSS
Base.prototype.css = function (cssKey, cssValue) {
	if (typeof cssValue != 'undefined' || cssKey instanceof Array) { // 设置
		if (cssKey instanceof Array) { // 集群
			var cssPattern = /^([a-z]+)\s*=\s*([\w\(\)\'\"\\\/\-#\.=%\s]+)$/i;
			var _cssKey = '', _cssValue = '';
			for (var i = 0; i < cssKey.length; i ++) {
				if (cssPattern.test(cssKey[i])) {
					_cssKey = cssPattern.exec(cssKey[i])[1];
					_cssValue = cssPattern.exec(cssKey[i])[2];
					for (var j = 0; j < this.elements.length; j ++) {
						this.elements[j].style[_cssKey] = _cssValue;
					}
				}
			}
		} else { // 单个
			for (var i = 0; i < this.elements.length; i ++) {
				this.elements[i].style[cssKey] = cssValue;
			}
		}
	} else { // 获取
		var css = [];
		for (var i = 0; i < this.elements.length; i ++) {
			css.push(Tool.getStyle(this.elements[i], cssKey));
		}
		if (css.length == 1) return css[0];
		return css;
	}
	return this;
};

// 添加 class 选择器
Base.prototype.addClass = function (className) {
	if (className instanceof Array) { // 集群
		for (var i = 0; i < className.length; i ++) {
			this.addClass(className[i]);
		}
	} else { // 单个
		var space = '';
		for (var i = 0; i < this.elements.length; i ++) {
			if (this.elements[i].className != '') space = ' ';
			if (!Base.hasClass(this.elements[i], className)) this.elements[i].className += space + className;
			space = '';
		}
	}
	return this;
};

// 移除 class 选择器
Base.prototype.removeClass = function (className) {
	if (className instanceof Array) { // 集群
		for (var i = 0; i < className.length; i ++) {
			this.removeClass(className[i]);
		}
	} else { // 单个
		var elementNode = {};
		for (var i = 0; i < this.elements.length; i ++) {
			elementNode = this.elements[i];
			if (Base.hasClass(elementNode, className)) {
				elementNode.className = elementNode.className.replace(new RegExp('\\s+' + className + '\\s+', 'i'), ' ');
				elementNode.className = elementNode.className.replace(new RegExp('(\\s+|^)' + className + '($|\\s+)', 'i'), '');
			}
		}
	}
	return this;
};

// 添加样式规则
Base.prototype.addRule = function (ruleName, ruleText, rulePosition, sheetIndex) {
	if (ruleName instanceof Array) { // 集群
		if (!ruleText instanceof Array || ruleName.length != ruleText.length) return this;
		for (var i = 0; i < ruleName.length; i ++) {
			this.addRule(ruleName[i], ruleText[i], rulePosition, sheetIndex);
		}
	} else { // 单个
		var rule = Base.checkRule(rulePosition, sheetIndex);
		if (typeof rule.sheet != 'undefined') {
			Tool.addRule(rule.sheet, ruleName, ruleText, rule.position);
		}
	}
	return this;
};

// 移除样式规则
Base.prototype.removeRule = function (rulePosition, ruleNumber, sheetIndex) {
	var rule = Base.checkRule(rulePosition, sheetIndex, ruleNumber);
	if (typeof rule.sheet != 'undefined') {
		for (var i = 0; i < rule.number; i ++) {
			Tool.removeRule(rule.sheet, rule.position);
		}
	}
	return this;
};

/*
	事件集合
*/
// 鼠标 click 事件
Base.prototype.click = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'click', method) : Tool.logoutEvent(this.elements[i], 'click', method);
		}
	}
	return this;
};

// 鼠标 mouseover 事件
Base.prototype.mouseover = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'mouseover', method) : Tool.logoutEvent(this.elements[i], 'mouseover', method);
		}
	}
	return this;
};

// 鼠标 mouseout 事件
Base.prototype.mouseout = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'mouseout', method) : Tool.logoutEvent(this.elements[i], 'mouseout', method);
		}
	}
	return this;
};

// 鼠标 mousedown 事件
Base.prototype.mousedown = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'mousedown', method) : Tool.logoutEvent(this.elements[i], 'mousedown', method);
		}
	}
	return this;
};

// 鼠标 mousemove 事件
Base.prototype.mousemove = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'mousemove', method) : Tool.logoutEvent(this.elements[i], 'mousemove', method);
		}
	}
	return this;
};

// 鼠标 mouseup 事件
Base.prototype.mouseup = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'mouseup', method) : Tool.logoutEvent(this.elements[i], 'mouseup', method);
		}
	}
	return this;
};

// 鼠标 mousewheel 事件
Base.prototype.mousewheel = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			Tool.mousewheel(this.elements[i], method, mode);
		}
	}
	return this;
};

// 元素 load 事件
Base.prototype.load = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'load', method) : Tool.logoutEvent(this.elements[i], 'load', method);
		}
	}
	return this;
};

// 元素 scroll 事件
Base.prototype.scroll = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'scroll', method) : Tool.logoutEvent(this.elements[i], 'scroll', method);
		}
	}
	return this;
};

// 窗框 resize 事件
Base.prototype.resize = function (method, mode) {
	if (typeof mode == 'undefined') mode = true;
	if (typeof method == 'function') {
		for (var i = 0; i < this.elements.length; i ++) {
			mode ? Tool.loginEvent(this.elements[i], 'resize', method) : Tool.logoutEvent(this.elements[i], 'resize', method);
		}
	}
	return this;
};

/*
	特效集合
*/
// 特效: 元素隐藏
Base.prototype.hide = function () {
	for (var i = 0; i < this.elements.length; i ++) {
		$(this.elements[i]).css('display', 'none');
	}
	return this;
};

// 特效: 元素显示
Base.prototype.show = function () {
	for (var i = 0; i < this.elements.length; i ++) {
		$(this.elements[i]).css('display', 'block');
	}
	return this;
};

// 特效: 鼠标移入移出 (下拉菜单)
Base.prototype.hover = function (overMethod, outMethod) {
	this.mouseover(overMethod);
	this.mouseout(outMethod);
	return this;
};

// 特效: 定位居中
Base.prototype.center = function () {
	var innerRectangle = Base.getInnerRectangle();
	var scroll = Base.scroll();
	var rectangle = {}, outerX = 0, outerY = 0;
	for (var i = 0; i < this.elements.length; i ++) {
		Base.setAbsolutePosition(this.elements[i]);
		rectangle = Base.getRectangle(this.elements[i]);
		outerX = (innerRectangle.innerWidth - rectangle.width) / 2;
		outerY = (innerRectangle.innerHeight - rectangle.height) / 2;
		if (outerX < 0) outerX = 0;
		if (outerY < 0) outerY = 0;
		$(this.elements[i]).css(['left = ' + ( scroll.scrollX + outerX) + 'px', 'top = ' + (scroll.scrollY + outerY) + 'px']);
	}
	return this;
};

// 特效: 遮罩锁屏
Base.prototype.lock = function () {
	var screenLock = $().getId('screenLock').getNodes();
	if (typeof screenLock == 'object') {
		if (Base.trim($(Base.commentNode(screenLock)).html()) != 0) {
			Base.removeElement(screenLock);
			screenLock = Base.addElement('div', 'id = screenLock');
		}
	} else {
		screenLock = Base.addElement('div', 'id = screenLock');
	}
	var scroll = Base.scroll();
	$(document.documentElement).css('overflow', 'hidden');
	Base.scroll(scroll.scrollX, scroll.scrollY);
	var innerRectangle = Base.getInnerRectangle();
	Base.setAbsolutePosition(screenLock);
	$(screenLock).css([
										'zIndex = 9998', 
										'left = ' + scroll.scrollX + 'px',
										'top = ' + scroll.scrollY + 'px',
										'width = ' + innerRectangle.innerWidth + 'px', 
										'height = ' + innerRectangle.innerHeight + 'px', 
										'backgroundColor = black',
										'opacity = 0.4', // W3C
										'filter = alpha(opacity = 40)'// IE 6/7/8
									]).show();
	Base.fixed(screenLock);
	return this;
};

// 特效: 清屏销锁
Base.prototype.unlock = function () {
	var screenLock = $().getId('screenLock').getNodes();
	if (typeof screenLock == 'object') {
		var scroll = Base.scroll();
		$(document.documentElement).css('overflow', 'auto');
		Base.scroll(scroll.scrollX, scroll.scrollY);
		$(screenLock).hide();
	}
	return this;
};

// 特效: 元素拖拽
Base.prototype.drag = function (mode) {
	if (typeof mode == 'undefined') mode = true;
	var down = function (event) {
		_this = mode ? this : this.parentNode;
		Base.setAbsolutePosition(_this);
		if (Base.trim($(Base.commentNode(_this)).html()).length == 0) event.preventDefault();
		var outerRectangle = Base.getOuterRectangle(_this);
		var fixedX = event.clientX - outerRectangle.outerX;
		var fixedY = event.clientY - outerRectangle.outerY;
		var scroll = Base.scroll();
		Tool.setCaptureIE(_this);
		var move = function (event) {
			var innerRectangle = Base.getInnerRectangle();
			var rectangle = Base.getRectangle(_this);
			var outerX = event.clientX - fixedX;
			var outerY = event.clientY - fixedY;
			var minX = scroll.scrollX, minY = scroll.scrollY;
			var maxX = innerRectangle.innerWidth - rectangle.width + scroll.scrollX;
			var maxY = innerRectangle.innerHeight - rectangle.height + scroll.scrollY;
			if (outerX < minX) outerX = minX; else if (outerX > maxX) outerX = maxX;
			if (outerY < minY) outerY = minY; else if (outerY > maxY) outerY = maxY;
			$(_this).css(['left = ' + outerX + 'px', 'top = ' + outerY + 'px']);
		};
		$(document).mousemove(move);
		var up = function () {
			Tool.releaseCaptureIE(_this);
			$(document).mousemove(move, false);
			$(document).mouseup(up, false);
		};
		$(document).mouseup(up);
	};
	this.mousedown(down);
	return this;
};

// 特效: 禁止元素溢出
Base.prototype.overflow = function () {
	var scroll = Base.scroll();
	var rectangle = {}, outerRectangle = {}, minX = 0, minY = 0, maxX = 0, maxY = 0, outerX = 0, outerY = 0;
	var innerRectangle = Base.getInnerRectangle();
	for (var i = 0; i < this.elements.length; i ++) {
		Base.setAbsolutePosition(this.elements[i]);
		rectangle = Base.getRectangle(this.elements[i]);
		outerRectangle = Base.getOuterRectangle(this.elements[i]);
		outerX = outerRectangle.outerX;
		outerY = outerRectangle.outerY;
		minX = scroll.scrollX;
		minY = scroll.scrollY;
		maxX = innerRectangle.innerWidth - rectangle.width + scroll.scrollX;
		maxY = innerRectangle.innerHeight - rectangle.height + scroll.scrollY;
		if (outerX < minX) outerX = minX; else if (outerX > maxX) outerX = maxX;
		if (outerY < minY) outerY = minY; else if (outerY > maxY) outerY = maxY;
		$(this.elements[i]).css(['left = ' + outerX + 'px', 'top = ' + outerY + 'px']);
	}
	return this;
};
/*
	库方法集合
*/
// 库方法: 重置滚动条
Base.scrollInitialization = function () {
	Tool.scrollInitializationX();
	Tool.scrollInitializationY();
};

// 库方法: 设置与获取滚动条
Base.scroll = function (x, y) {
	if (typeof x == 'number' && typeof y == 'number') { // 设置
		Tool.scrollX(x);
		Tool.scrollY(y);
	} else { // 获取
		return {
			scrollX : Tool.scrollX(),
			scrollY : Tool.scrollY()
		}
	}
};

// 库方法: 检测 class 元素节点
Base.hasClass = function (elementNode, className) {
	if ((new RegExp('(^|\\s+)' + className + '(\\s+|$)', 'i')).test(elementNode.className)) return true;
	return false;
};

// 库方法: 检测样式规则
Base.checkRule = function (rulePosition, sheetIndex, ruleNumber) {
	if (typeof sheetIndex == 'undefined' || isNaN(sheetIndex)) sheetIndex = 0;
	var sheetObject = document.styleSheets[sheetIndex];
	var rules = Tool.getRules(sheetObject);
	if (rules == 0) {
		rulePosition = 0;
		ruleNumber = 0;
	}
	if (typeof rulePosition == 'undefined' || isNaN(rulePosition)) rulePosition = 0;
	if (rules < rulePosition) rulePosition = rules;
	if (typeof ruleNumber == 'undefined' || isNaN(ruleNumber)) ruleNumber = 1;
	if (rules < ruleNumber) ruleNumber = rules;
	if (rules - rulePosition < ruleNumber) ruleNumber = rules - rulePosition;
	return {
		position : rulePosition,
		sheet : sheetObject,
		number : ruleNumber
	}
};

// 库方法: 字符串截取
Base.substring = function (string, index) {
	if (typeof string != 'string') return string;
	if (string.indexOf(index) != -1) string = string.replace(index, '');
	return string;
};

// 库方法: 屏蔽两边空格
Base.trim = function (string) {
	if (typeof string != 'string') return string;
	var leftPattern = /^([\s\t]+)/, rightPattern = /([\s\t]+)$/;
	if (leftPattern.test(string)) string = string.replace(leftPattern, '');
	if (rightPattern.test(string)) string = string.replace(rightPattern, '');
	return string;
};

// 库方法: 屏蔽空白文本节点
Base.spaceNode = function (elementNode) {
	if (typeof elementNode != 'object') return elementNode;
	var childs = elementNode.childNodes;
	var pattern = /^[\s\t]+$/;
	for (var i = 0; i < childs.length; i ++) {
		if (childs[i].nodeType == 3 && pattern.test(childs[i].nodeValue)) elementNode.removeChild(childs[i]);
	}
	return elementNode;
}

// 库方法: 屏蔽注释节点
Base.commentNode = function (elementNode) {
	if (typeof elementNode != 'object') return elementNode;
	var childs = elementNode.childNodes;
	var position = '';
	if (elementNode.id != '') {
		position = elementNode.id;
	} else if (elementNode.className != '') {
		position = 'class = ' + elementNode.className;
	} else {
		position = 'tagName = ' + elementNode.tagName;
	}
	var comments = $().getTagName('!', position).getNodes();
	if (comments instanceof Array) { // 兼容 IE 
		for (var i = 0; i < comments.length; i ++) {
			elementNode.removeChild(comments[i]);
		}
	}
	for (var j = 0; j < childs.length; j ++) {
		if (childs[j].nodeType == 8) elementNode.removeChild(childs[j]);
	}
	return elementNode;
};

// 库方法: 定位器筛选
Base.positioner = function (position) {
	var namePattern = /^name\s*=\s*(\w+)$/i;
	var tagNamePattern = /^tag(Name)?\s*=\s*(\w+)$/i;
	var classPattern = /^class(Name)?\s*=\s*(\w+)$/i;
	var idPattern = /^id\s*=\s*(\w+)$/i;
	var selector = [];
	if (namePattern.test(position)) { // name
		position = namePattern.exec(position)[1];
		selector = $().getName(position).getNodes();
	} else if (tagNamePattern.test(position)) { // tagName
		position = tagNamePattern.exec(position)[2];
		selector = $().getTagName(position).getNodes();
	} else if (classPattern.test(position)) { // class
		position = classPattern.exec(position)[2];
		selector = $().getClass(position).getNodes();
	} else if (idPattern.test(position)) { // id
		position = idPattern.exec(position)[1];
		selector = $().getId(position).getNodes();
	} else { // id
		selector = $().getId(position).getNodes();
	}
	return selector;
}

// 库方法: 添加属性
Base.addAttribute = function (elementNode, attributes) {
	if (attributes instanceof Array) {
		for (var i = 0; i < attributes.length; i ++) {
			this.addAttribute(elementNode, attributes[i]);
		}
	} else {
		var attributePattern = /^([a-z]+)\s*=\s*([\w\-\\\/=\s\';\.:\"\)\(]+)$/i;
		var attributeKey = '', attributeValue = '';
		if (attributePattern.test(attributes)) {
			attributeKey = attributePattern.exec(attributes)[1];
			attributeValue = attributePattern.exec(attributes)[2];
			if (attributeKey == 'style') { // CSS IE 6/7 特殊处理
				var cssPattern = /^([a-z]+)\s*:\s*([\w\(\)\'\"\\\/\-#\.=%\s]+)$/i;
				var cssKey = '', cssValue = '';
				if (/(;\s*)/.test(attributeValue)) { // 集群
					attributeValue = attributeValue.replace(/(;\s*)/g, '|');
					var css = attributeValue.split('|');
					for (var i = 0; i < css.length; i ++) {
						if (cssPattern.test(css[i])) {
							cssKey = cssPattern.exec(css[i])[1];
							cssValue = cssPattern.exec(css[i])[2];
							$(elementNode).css(cssKey, cssValue);
						}
					}
				} else { // 单个
					if (cssPattern.test(attributeValue)) {
						cssKey = cssPattern(attributeValue).exec(attributeValue)[1];
						cssValue = cssPattern(attributeValue).exec(attributeValue)[2];
						$(elementNode).css(cssKey, cssValue);
					}
				}
			} else {
				elementNode.setAttribute(attributeKey, attributeValue);
			}
		}
	}
	
};

// 库方法: 创建元素节点
Base.addElement = function (elementName, attributes, html, parentElement) {
	if (typeof parentElement == 'undefined' && typeof parentElement != 'string' && typeof parentElement != 'object') parentElement = document.body;
	if (typeof parentElement == 'string') parentElement = Base.positioner(parentElement);
	var elementNode = document.createElement(elementName);
	if (typeof html != 'undefined') $(elementNode).html(html);
	if (typeof attributes != 'undefined') Base.addAttribute(elementNode, attributes);
	if (parentElement instanceof Array) { // 集群
		for (var i = 0; i < parentElement.length; i ++) {
			parentElement[i].appendChild(elementNode);
		}
	} else { // 单个
		parentElement.appendChild(elementNode);
	}
	return elementNode;
};

// 库方法: 删除元素节点
Base.removeElement = function (attributes, parentElement) {
	if (typeof parentElement == 'string') parentElement = Base.positioner(parentElement);
	if (attributes instanceof Array) { // 集群
		for (var i = 0; i < attributes.length; i ++) {
			this.removeElement(attributes[i], parentElement);
		}
	} else { // 单个
		elementNode = typeof attributes == 'object' ? attributes : Base.positioner(attributes);
		if (elementNode instanceof Array) { // 集群
			var sevedNode = [];
			for (var i = 0; i < elementNode.length; i ++) {
				sevedNode = elementNode;
				this.removeElement(elementNode[i], parentElement);
				elementNode = sevedNode;
			}
		} else { // 单个
			if (typeof parentElement == 'undefined') parentElement = elementNode.parentNode;
			if (parentElement instanceof Array) { // 集群
				for (var i = 0; i < parentElement.length; i ++) {
					if (typeof parentElement[i] == 'object' && Base.hasChildNode(parentElement[i], elementNode)) parentElement[i].removeChild(elementNode);
				}
			} else { // 单个
				if (typeof parentElement == 'object' && Base.hasChildNode(parentElement, elementNode)) parentElement.removeChild(elementNode);
			}
		}
	}
};

// 库方法: 检测元素从属关系(直接从属)
Base.hasChildNode = function (parentElement, elementNode) {
	var childs = parentElement.childNodes;
	for (var i = 0; i < childs.length; i ++) {
		if (childs[i] == elementNode) return true;
	}
	return false;
};

// 库方法: 获取元素大小尺寸
Base.getRectangle = function (elementNode) {
	var width = 0, height = 0, display = '', _this = {};
	_this = $(elementNode);
	width = _this.css('width');
	height = _this.css('height');
	display = _this.css('display');
	if (width == 'auto' || height == 'auto') {
		if (display == 'none') _this.show();
		width = elementNode.offsetWidth;
		height = elementNode.offsetHeight;
	}
	width = this.substring(width, 'px');
	height = this.substring(height, 'px');
	return {
		width : width,
		height : height
	};
};

// 库方法: 获取元素外边距尺寸
Base.getOuterRectangle = function (elementNode) {
	this.setAbsolutePosition(elementNode);
	var outerX = 0, outerY = 0, display = '', _this = {};
	_this = $(elementNode);
	outerX = _this.css('left');
	outerY = _this.css('top');
	display = _this.css('display');
	if (outerX == 'auto' || outerY == 'auto') {
		if (display == 'none') _this.show();
		outerX = elementNode.offsetLeft;
		outerY = elementNode.offsetTop;
	}
	outerX = this.substring(outerX, 'px');
	outerY = this.substring(outerY, 'px');
	return {
		outerX : outerX,
		outerY : outerY
	};
};

// 库方法: 获取网页可视区尺寸
Base.getInnerRectangle = function () {
	var innerWidth = Tool.getInnerWidth();
	var innerHeight = Tool.getInnerHeight();
	return {
		innerWidth : innerWidth,
		innerHeight : innerHeight
	};
};

// 库方法: 设置元素绝对定位
Base.setAbsolutePosition = function (elementNode) {
	if ($(elementNode).css('position') != 'absolute') {
		$(elementNode).css(['position = absolute', 'left = 0', 'top = 0']);
	}
};

// 库方法: 禁止页面滚动(修正浏览器BUG)
Base.fixed = function (elementNode) {
	// IE 禁止方式
	$(elementNode).mousedown(function () {
		$(elementNode).mousemove(function (event) {
			event.preventDefault();
		});
	});
	// Chrome 禁止方式
	$(elementNode).mousewheel(function (event) {
		event.preventDefault();
	});
};

 

/*
	源码作者: 石不易(Louis Shi)
	联系方式: http://www.shibuyi.net
	===================================================================================
	程序名称: JavaScript 工具库(跨浏览器兼容) BETA 2.0 版
	迭代版本: BETA 1.0
	功能总数: 18 个
	新增总数: 3 个
	删除总数: 2 个
	追加功能: 
		1. 跨浏览器检测元素从属关系(直接从属+间接从属)
		2. 跨浏览器获取与设置滚动条(x轴+y轴)
		...
	优化功能: 
		1. 跨浏览器现代事件绑定(注册事件+注销事件)
		2. 跨浏览器配备事件对象(IE 6/7/8 专属)
		...
	删除功能: 
		1. 跨浏览器取消事件冒泡
		2. 跨浏览器取消事件默认行为
		...
*/
// 工具库
var Tool = {

		// 数组排序
		sort : function () {
			return {
				minToMax : function (min, max) { // 正序: 从小到大
					if (min < max) {
						return -1;
					} else if (min > max) {
						return 1;
					} else {
						return 0;
					}
				},
				maxToMin : function (min, max) { // 倒序: 从大到小
					if (min < max) {
						return 1;
					} else if (min > max) {
						return -1;
					} else {
						return 0;
					}
				}
			}
		},
		
		// 跨浏览器获取计算后的 CSS 样式
		getStyle : function (elementNode, cssKey) {
			if (typeof window.getComputedStyle != 'undefined') { // W3C
				return window.getComputedStyle(elementNode, null)[cssKey];
			} else if (typeof elementNode.currentStyle != 'undefined') { // IE 6/7/8
				return elementNode.currentStyle[cssKey];
			}
		},
		
		// 跨浏览器添加样式规则
		addRule : function (sheet, ruleName, ruleText, rulePosition) {
			if (typeof sheet.insertRule != 'undefined') { // W3C
				sheet.insertRule(ruleName + ' {' + ruleText + '}', rulePosition);
			} else if (typeof sheet.addRule != 'undefined') { // IE 6/7/8
				sheet.addRule(ruleName, ruleText, rulePosition);
			}
		},
		
		// 跨浏览器移除样式规则
		removeRule : function (sheet, rulePosition) {
			if (typeof sheet.deleteRule != 'undefined') { // W3C
				sheet.deleteRule(rulePosition);
			} else if (typeof sheet.removeRule != 'undefined') { // IE 6/7/8
				sheet.removeRule(rulePosition);
			}
		},
		
		// 跨浏览器获取样式规则总数
		getRules : function (sheet) {
			if (typeof sheet.cssRules != 'undefined') { // W3C
				return sheet.cssRules.length;
			} else if (typeof sheet.rules != 'undefined') { // IE 6/7/8
				return sheet.rules.length;
			}
		},
		
		// 事件绑定计数器
		eventId : 0,
		
		// 跨浏览器现代事件绑定: 注册事件
		loginEvent : function (elementNode, eventName, method) {
			if (eventName.indexOf('on') == 0) eventName = eventName.substring(2, eventName.length);
			if (typeof elementNode.addEventListener != 'undefined') { // W3C
				elementNode.addEventListener(eventName, method, false);
			} else if (typeof elementNode.attachEvent != 'undefined') { // IE 6/7/8
				// 创建哈希表,存储事件数组
				if (typeof elementNode.hashTable != 'object') elementNode.hashTable = {};
				// 创建事件数组,储存事件方法
				if (typeof elementNode.hashTable[eventName] != 'object') elementNode.hashTable[eventName] = [];
				// 获取事件数组
				var events = elementNode.hashTable[eventName];
				// 检测同一节点、同一事件是否方法重复
				for (var i = 0; i < events.length; i ++) {
					if (events[i] == method) return false;
				}
				// 储存事件方法
				events[this.eventId ++] = method;
				var _this = this;
				// 执行事件方法
				elementNode['on' + eventName] = function () {
					var event = _this.eventIE(window.event);
					for (var i = 0; i < events.length; i ++) {
						if (typeof events[i] != 'undefined') events[i].call(this, event);
					}
				};
				
			}
		},
		
		// 跨浏览器现代事件绑定: 注销事件
		logoutEvent : function (elementNode, eventName, method) {
			if (eventName.indexOf('on') == 0) eventName = eventName.substring(2, eventName.length);
			if (typeof elementNode.removeEventListener != 'undefined') { // W3C
				elementNode.removeEventListener(eventName, method, false);
			} else if (typeof elementNode.detachEvent != 'undefined') { // IE 6/7/8
				if (typeof elementNode.hashTable != 'undefined' && typeof elementNode.hashTable[eventName] != 'undefined') {
					var events = elementNode.hashTable[eventName];
					for (var i = 0; i < events.length; i ++) {
						if (events[i] == method) delete events[i];
					}
				}
			}
		},
		
		// 跨浏览器配备事件对象(IE 6/7/8 专属)
		eventIE : function (event) {
			// 配备取消事件冒泡
			event.stopPropagation = function () {
				event.cancelBubble = true;
			};
			
			// 配备取消事件默认行为
			event.preventDefault = function () {
				event.returnValue = false;
			};
			
			// 配备获取事件绑定对象
			event.target = event.srcElement;
			
			return event;
		},
		
		// 跨浏览器鼠标滚轮(中键)事件
		mousewheel : function (elementNode, method, mode) {
			if (typeof elementNode.onmousewheel != 'undefined') { // 非 Firefox
				mode ? this.loginEvent(elementNode, 'mousewheel', method) : this.logoutEvent(elementNode, 'mousewheel', method);
			} else { // Firefox
				mode ? this.loginEvent(elementNode, 'DOMMouseScroll', method) : this.logoutEvent(elementNode, 'DOMMouseScroll', method);
			}
		},
		
		// 跨浏览器检测元素从属关系(直接从属+间接从属)
		hasChildNode : function (parentElement, elementNode) {
			if (typeof parentElement.contains != 'undefined') { // W3C
				return parentElement.contains(elementNode);
			} else if (typeof parentElement.compareDocumentPosition != 'undefined') { // 低版本浏览器
				return parentElement.compareDocumentPosition(elementNode) == 20;
			}
			return false;
		},
		
		// 跨浏览器获取网页可视区宽度尺寸
		getInnerWidth : function () {
			if (typeof window.innerWidth != 'undefined') { // W3C
				return window.innerWidth;
			} else { // IE 6/7/8
				return document.documentElement.clientWidth;
			}
		},
		
		// 跨浏览器获取网页可视区高度尺寸
		getInnerHeight : function () {
			if (typeof window.innerHeight != 'undefined') { // W3C
				return window.innerHeight;
			} else { // IE 6/7/8
				return document.documentElement.clientHeight;
			}
		},
		
		// 跨浏览器重置横向窗体滚动条
		scrollInitializationX : function () {
			this.scrollX(0);
		},
		
		// 跨浏览器重置纵向窗体滚动条
		scrollInitializationY : function () {
			this.scrollY(0); 
		},
		
		// 跨浏览器获取与设置滚动条X轴
		scrollX : function (x) {
			if (typeof x != 'undefined') { // 设置
				document.documentElement.scrollLeft = x; // 非 Chrome / Safari
				document.body.scrollLeft = x; // Chrome / Safari
			} else { // 获取
				return document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
			}
		},
		
		// 跨浏览器获取与设置滚动条Y轴
		scrollY : function (y) {
			if (typeof y != 'undefined') { // 设置
				document.documentElement.scrollTop = y; 
				document.body.scrollTop = y;
			} else { // 获取
				return document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
			}
		},
		
		// IE 专属事件: 浏览器外捕获鼠标按下
		setCaptureIE : function (elementNode) {
			if (typeof elementNode.setCapture != 'undefined') { // IE
				elementNode.setCapture();
			}
		},
		
		// IE 专属事件: 浏览器外捕获鼠标弹起
		releaseCaptureIE : function (elementNode) {
			if (typeof elementNode.releaseCapture != 'undefined') { // IE
				elementNode.releaseCapture();
			}
		}
};

 

关于 BETA 2.0 测试版核心源码与实例演示的获取请移动至官网下载!

 

感谢大家积极评测给予意见!

 

官网地址:http://www.shibuyi.net

 

CNBlogs 博客:http://www.cnblogs.com/shibuyi/

 

CSDN 博客:http://blog.csdn.net/louis_shi/

 

ITeye 博客:http://shibuyi.iteye.com/

 

分享到:
评论

相关推荐

    asp.net知识库

    2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0) Server Side ViewState 在服务器端存贮ViewState (ASP.NET 2.0) VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step ...

    ExtAspNet_v2.3.2_dll

    ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有ViewState,没有JavaScript,没有CSS,没有UpdatePanel,没有WebServices的Web应用程序。 支持的浏览器: IE 7.0+, Firefox...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    Java资源包01

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有JavaScript,没有CSS,没有UpdatePanel,没有WebServices的Web应用程序。 支持的浏览器: IE 7.0+, Firefox 3.0+, Chrome ...

    java开源包8

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包1

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包11

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包2

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包3

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包6

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包5

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包10

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包4

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包7

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包9

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包101

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    jquery插件使用方法大全

    由于jQuery已经成为目前最流行的JavaScript库,得到广泛的支持,新版本的发布当然非常引人注目。 重要变化: 1. Ajax重写Ajax模块完全进行了重写。新增一个jXHR对象,为不同浏览器内置的XMLHttpRequest提供了一致的...

Global site tag (gtag.js) - Google Analytics