jquery自定义插件 - 弹出窗

jquery自定义插件 -- 弹出窗
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script src="jquery-2.0.3.min.js" type="text/javascript"></script>

<script>

//Figure out what browser is being used (Fixed the issue jquery version after 1.9)
$.browser = {
mozilla : /firefox/.test(navigator.userAgent.toLowerCase()),
webkit : /webkit/.test(navigator.userAgent.toLowerCase()),
opera : /opera/.test(navigator.userAgent.toLowerCase()),
msie : /msie/.test(navigator.userAgent.toLowerCase()),
};
</script>


<script>
/**
 * 自定义插件:实现在浏览器中定位窗口的位置 这里根据用户传过来的参数进行设置窗口的位置(上下左右4个角落以及中间)
 *
 * @param height
 *            窗体高度,如400(建议不带单位,默认为px) 
 * @param width
 *            窗体宽度,如600(建议不带单位,默认为px)
 * @param title
 *            窗体顶端的标题
 * @param message
 *            窗体显示的内容
 * @param left
 *            表示窗口水平位置-->可选值:"center"、"left"、"right"、具体的数值,如:200
 * @param top
 *            表示窗口垂直位置-->可选值:"center"、"top"、"bottom"、具体的数值,如:300
 * @param type
 *            表示类型
 *            可选值:"default"、"rollup"。default--->表示默认的,没有动画。rollup--->表示在右下角滑上来(像QQ消息提示框一样)
 *
 */
$.fn.popUpWin = function(args) {
	var currentWin = this; // 将当前对象设置成currentWin,以方便使用
	var windowObj = $(window); // 转化window为JQuery对象

	var winWidth = 600; //windos's width
	var winWidthUnit = '600px'; //width with unit
	var winHeight = 400; //windows's height
	var winHeightUnit = '400px'; //width with unit
	var browserWidth = windowObj.width(); // 浏览器的宽
	var browserHeight = windowObj.height(); // 浏览器的高
	var scrollLeft = windowObj.scrollLeft(); // 获取滚动条的左边距(滚动条里最左端的差距)
	var scrollTop = windowObj.scrollTop(); // 获取滚动条的上边距
	var winLeft; // 窗口的左边距
	var winTop; // 窗口的上边距
	
	var positionLeft;
	var positionTop;
	var title = 'Message Dialog';
	var message = 'No message show up!';
	var type; //窗口类型
	
	//check if it is a number
	function isNumber(tester){
		var re = /\D+/;
		return !re.test(tester);
	}
	//get number from strig such as 600px will return 600
	function getNumber(str) {
		var re = /^\d+/;
		return str.match(re);
	}
	
	function getUnion(str) {
		var re = /\D+/;
		return str.match(re);
	}
	
	
	// init params
	if (args && args instanceof Object) {
		
		if(args.height && args.height!=''){
			if(isNumber(args.height)){
				winWidth = args.height;
				winWidthUnit = args.height + 'px';
			} else {
				winWidth = getNumber(args.height);
				winWidthUnit = args.height;
			}
		}
		
		if(args.width && args.width!=''){
			if(isNumber(args.width)){
				winWidth = args.width;
				winWidthUnit = args.width + 'px';
			} else {
				winWidth = getNumber(args.width);
				winWidthUnit = args.width;
			}
		}
		
		if(args.title && args.title!='') {
			title = args.title;
		}
		if(args.message && args.message!=''){
			message = args.message;
		}
		
		if(args.type && args.type!='') {
			type = args.type;
		}
		
		if(args.left && args.left!='') {
			positionLeft = args.left;
		}
		
		if(args.left && args.top!='') {
			positionTop = args.top;
		}
	}
	
	
	/*
	* init component
	*/
	function initComponent(){
		
		var appendStr = "<div class='pop_up_title'><span class='pop_up_cls'><input type='button' value='Close'/></span><span class='pop_up_txt'>" 
		+ title
		+ "</span></div><hr color='#0099FF'/><div class='pop_up_content'><span class='pop_up_content_txt' style='" 
		+ (winHeight-50)
		+ getUnion(winHeightUnit) + ";'>"
		+ message
		+ "</span></div>";

		currentWin.addClass("pop_up_window");
		
		currentWin.css( {
				"width" : winWidthUnit,
				"height" : winHeightUnit
		});
			
		currentWin.append(appendStr);

	}
	// init component
	initComponent();

	// 处理水平位置的参数
	function calLeft(positionLeft, scrollLeft, browserWidth, winWidth) {
		if (positionLeft && typeof positionLeft == "string") { // 判断参数为字符串
			if (positionLeft == "center") { // left参数为center,则水平居中
				winLeft = (browserWidth - winWidth) / 2 + scrollLeft;
			} else if (positionLeft == "left") { // left参数为left,则水平居左
				winLeft = scrollLeft;
			} else if (positionLeft == "right") { // left参数为right,则水平居右
				winLeft = scrollLeft + browserWidth - winWidth;
			} else { // 用户输入了其他字符串,则改为默认居中
				winLeft = (browserWidth - winWidth) / 2 + scrollLeft - 30;
			}
		} else if (positionLeft && typeof positionLeft == "number") { // 判断参数为数值,则根据数值直接设置
			winLeft = positionLeft;
		} else {  //其他情况,默认居中。如:没有输入该参数或非法字符
			winLeft = (browserWidth - winWidth) / 2 + scrollLeft;
			positionLeft = "cneter";
		}
	}

	// 处理垂直位置的参数
	function calTop(positionTop, scrollTop, browserHeight, winHeight) {
		if (positionTop && typeof positionTop == "string") {
			if (positionTop == "top") {
				winTop = scrollTop;
			} else if (positionTop == "center") {
				winTop = (browserHeight - winHeight) / 2 + scrollTop;
			} else if (positionTop == "bottom") {
				winTop = scrollTop + browserHeight - winHeight;
			} else {
				winTop = (browserHeight - winHeight) / 2 + scrollTop;
			}
		} else if (positionTop && typeof positionTop == "number") { // 判断参数为数值,则根据数值直接设置
			winTop = positionTop;
		} else {
			winTop = (browserHeight - winHeight) / 2 + scrollTop;
			positionTop = "center";
		}
	}
	
	// *******这里很重要,将传过来的参数缓存在data.positionLeft中,这样做是为了在后面滚动条滚动或浏览器大小改变时使用,这里有点像java中的hashMap
	currentWin.data("positionLeft", positionLeft); // 缓存数据
	currentWin.data("positionTop", positionTop); // 缓存数据

	// 移动窗口,此方法仅供滚动条滚动以及窗口大小时使用,不适合初始化(就是在加载页面时,调用了该插件)时使用,因为一开始不存在currentWin.data("positionLeft")和currentWin.data("positionTop")的值
	function moveWin() {
		// 重新获取一些值并调用响应的内部函数进行设置
		var browserWidth = windowObj.width(); // 浏览器的宽
		var browserHeight = windowObj.height(); // 浏览器的高
		var scrollLeft = windowObj.scrollLeft(); // 获取滚动条的左边距(滚动条里最左端的差距)
		var scrollTop = windowObj.scrollTop(); // 获取滚动条的上边距

		// 调用方法重新计算左边距和上边距
		calLeft(currentWin.data("positionLeft"), scrollLeft, browserWidth,
				winWidth);
		calTop(currentWin.data("positionTop"), scrollTop, browserHeight,
				winHeight);

		// 设置窗口位置
		currentWin.animate( {
			"left" : winLeft,
			"top" : winTop
		}, 200); // 注意:currentWin在css定义中一定要注明position:absolute;
	}
	
	
	//窗口类型
	if(type && type == "rollup"){  //这里实现像QQ消息框效果,在右下角滑上来,并慢慢淡出
			//如果窗口可见,将其设置成隐藏
			if(currentWin.is(":visible")){
				currentWin.hide();
			}
			calLeft(positionLeft, scrollLeft, browserWidth, winWidth);
			calTop(positionTop, scrollTop, browserHeight, winHeight);
			var left = winLeft;
			if($.browser.mozilla){  //修正firefox左边距
				left =  winLeft-10;
			}
			currentWin.css( {
				"left" : left,
				"top" : winTop + winHeight
			});
			
			currentWin.show(500).animate( {
				"top" : winTop
			}, 500)
			var fadeOutTimeOut;
			clearTimeout(fadeOutTimeOut); // 先清除所有延时,以免重复叠加
			fadeOutTimeOut = setTimeout(function() {
				currentWin.fadeOut(25000).dequeue();//15秒淡出   《dequeue():去除动画队列中第一个动画,但该动画仍会继续执行,这样能保证后面的动画不需要等到第一个动画执行完才执行,这样可以防止在滚动条滚动时能在淡出的同时也能移动位置》
			}, 3000); // 3秒后开始淡出
			
			//鼠标悬停在窗口上,取消隐藏
			currentWin.mouseover(function(){
				if(!currentWin.is(":visible")){ //若窗口本身为不可见时不执行后面两句语句
					return;
				}
				currentWin.stop(true,true);
				currentWin.fadeIn(0);
			});
			
			//鼠标移开,3秒后再次隐藏
			currentWin.mouseout(function(){
				if(!currentWin.is(":visible")){
					return;
				}
				clearTimeout(fadeOutTimeOut); // 先清除所有延时,以免重复叠加
				fadeOutTimeOut = setTimeout(function() {
					currentWin.fadeOut(25000).dequeue();
				}, 3000);
			});
			
			
			
			
			
		} else {  //普通情况
			calLeft(positionLeft, scrollLeft, browserWidth, winWidth);
			calTop(positionTop, scrollTop, browserHeight, winHeight);
			
			currentWin.css( {
				"left" : winLeft,
				"top" : winTop
			});
			
			currentWin.show("slow"); //显示窗口
		}



	// 为当前窗口注册滚动条滚动事件,在滚动条滚动时能够动态改变窗口的位置
	windowObj.scroll(function() {
		if (!currentWin.is(":visible")) {
			return;
		}
		var scrollTimeOut; // 延时处理,由于拉动滚动条时不断改变窗口位置会导致浏览器会一闪一闪,所以通过延时修改
		clearTimeout(scrollTimeOut); // 先清除所有延时,以免重复叠加
		scrollTimeOut = setTimeout(function() {
			moveWin();
		}, 300); // 延时300毫秒
		});

	// 为当前窗口注册浏览器大小改变事件
	windowObj.resize(function() {
		if (!currentWin.is(":visible")) { // 判断若当前窗口为不可见则不进行该事件的处理
				return;
			}
			moveWin();
		});


	// 注册关闭窗口事件
	$(currentWin).find("span[class='pop_up_cls']").click(function() {
		$(currentWin).fadeOut(0);
	});
	
	return currentWin;
}
</script>


<script>
function load(){
	$("#test").popUpWin({
		title: "testing",
		message: "testing message!",
		width:'600px',
		height: '400px',
		left:'center',
		top:'center'
	});
}
</script>




<style>
/*整个窗体的样式*/
.pop_up_window{
	/*background-color:#D0DEF0;*/
	/*width:600px;
	height:400px;*/
	border:5px solid #B3D9FF;
	margin:0px;
	display:none;
	position: absolute;
	z-index:999;
}

/*窗体内容区的样式*/
.pop_up_content{
	background-color:#FFF;
	width:100%;
	height:350px;

/*	position:relative;*/
}

/*窗体标题栏的样式*/
.pop_up_title{
	marging:0;
	padding:0;
	border:0;
	width:100%;
	height:25px;
	background:#FFF;
	font-size:14px;
	font-weight:bold;

}
/*窗体标题右侧图片的样式*/
.pop_up_title .pop_up_cls{
	padding:0;
	margin-top:3px;
	width:65px;
	height:25px;
	overflow:hidden;
	display:block;  /*一定要设置成block不然不会显示*/
	float:right;

}
/*窗体标题文字的样式*/
.pop_up_title .pop_up_txt{
	display:block;
	height:25px;
	line-height:25px;
	margin-left:5px;
}

/*内容区文本(主体文本)*/
.pop_up_content_txt{
	marging:0;
	padding:0 5px;
	display:block;
	/*height:350px;*/
	background:#CBE7FC;
	overflow:auto; /*这里设置的auto是为了当要显示的内容过多时,会自动出现滚动条*/

}


</style>
</head>

<body onload="load()">

<div id="test">

</div>
 
</body>
</html>