首页 > javascript > v哥的pop弹出插件的几点改动

v哥的pop弹出插件的几点改动

2010年9月6日 effect 发表评论 阅读评论

v哥哥的弹出插件在:http://www.myquickphp.com/archives/163
这个插件存在的问题:
1.暴露给$.fn的接口过多
2.会影响其他的window.onresize window.onscroll document.onmousemove事件
3.谷歌浏览器chrom不兼容(表现在scroll事件和resize事件失效)

修改过后的代码:

(function($){
	function divDragGable(titleDivid , dragDivid)
	{
		document.getElementById(titleDivid).style.cursor = "move";
		document.getElementById(titleDivid).onmousedown=function(e){
			var posX;
			var posY;  
			var fdiv = document.getElementById(dragDivid); 
			if(!e) e = window.event;
			posX = e.clientX - parseInt(fdiv.style.left);
			posY = e.clientY - parseInt(fdiv.style.top);
			function mousemove(ev){
				if(ev==null) ev = window.event;
				fdiv.style.left = (ev.clientX - posX) + "px";
				fdiv.style.top = (ev.clientY - posY) + "px";
				return false;
			}
			$(document).mousemove(mousemove).mouseup(function(){
				$(document).unbind('mousemove',mousemove);
			});
		}
	}
	function setDivPox(jqBackDiv,jqPopDiv,isScrollEvent)
	{
		//自动判断当前是否支持W3C标准的
		var bodyObj = document.documentElement;
		//文档没有DOCTYPE声明,是 HTML文档,否则是XHTML文档
		if(document.compatMode == 'BackCompat'){
			bodyObj = document.body;
		}
		//--设置遮罩层为满屏
		jqBackDiv.width(Math.max(bodyObj.scrollWidth, document.documentElement.clientWidth));
		jqBackDiv.height(Math.max(bodyObj.scrollHeight, document.documentElement.clientHeight));
		//调整要显示的DIV的位置
		var dleft = bodyObj.clientWidth/2 - jqPopDiv.width()/2;
		var dtop = bodyObj.clientHeight/2 - jqPopDiv.height()/2;
		//如果是Scroll事件
		if(typeof(isScrollEvent)!= 'undefined' && isScrollEvent){
			dleft += bodyObj.scrollLeft + document.body.scrollLeft;
			dtop += bodyObj.scrollTop + document.body.scrollTop;
		}
		jqPopDiv.css({left:dleft,top:dtop,position:'absolute',zIndex:1001});
	}
	function pop(options,jq){
		$.extend(this.options,options || {});
		this.jq = jq;
	}
	pop.prototype={
		options:{
			closeId:'',//可以执行关闭当前层的DOM ID,这个值是可选项
			titleId:'', //层移动的DOM ID,这个值是可选项,
			backDivColor:'#333',//遮罩层的颜色
			showAnimate:true, //弹出层显示时是否有动画效果
			backDivId:'pop__div__id'//遮罩层的ID,一般不在程序中设置
		},
		show:function(){
			//弹出一个遮罩层
			var backDivId = this.options.backDivId;
			//--如果弹出层不存在则添加
			if($('#'+backDivId).length < 1){
				//--遮罩层追加到 body  //#333
				var divStr = '<div id="'+backDivId+'" style="background-color:'+this.options.backDivColor+';filter: Alpha(Opacity=40); -moz-opacity:.1; opacity:0.5;  position:absolute; left:0px;top:0px; z-index:1000"></div>';	
				$(divStr).appendTo('body');
			}
 
			//设置位置
			setDivPox($('#'+backDivId),this.jq);
 
			//动画效果显示出来
			$('#'+backDivId).show();
			this.options.showAnimate ? this.jq.fadeIn("slow") : this.jq.show();
 
			//将当前jQuery对象保存,在绑定事件中会用到
			var that = this;
 
			//绑定关闭事件的DOM
			var ary = this.options.closeId.split(',');
			for(var i=0; i<ary.length; ++i){
				$('#'+ary[i]).click(function(){
					that.hide();
				});
				//鼠标显示手型
				$('#'+ary[i]).css({cursor:'pointer'});
			}
 
			//绑定弹出层的移动效果
			if(this.options.titleId != ''){
				divDragGable(this.options.titleId , this.jq.attr('id'));
			}
 
			this.jq.data('resize',function(){
				setTimeout(function(){
					setDivPox($('#'+backDivId),that.jq);
				},10);
			});
			this.jq.data('scroll',function(){
				setTimeout(function(){
					setDivPox($('#'+backDivId),that.jq,true);
				},10);
			});
			$(window).resize(this.jq.data('resize')).scroll(this.jq.data('scroll'));
			return this;
		},
		hide:function(){
			//隐藏层
			var that = this;
			this.jq.hide();
			$('#'+this.options.backDivId).hide();
			//取消绑定的事件
			$(window).unbind('resize',this.jq.data('resize')).unbind('scroll',this.jq.data('scroll'));
			return this;
		}
	};
	$.fn.extend({pop:function(config){
		return new pop(config,this);
	}});
})(jQuery);

使用方法:

var api = $('#div1').pop({closeId:'close1,close2',titleId:'title1'}).show();
//api有show和hide两个方法,可以手动调用api.hide()来关闭层
分类: javascript 标签:
  1. 2010年9月12日00:53 | #1

    哲明牛B,又学习了,和高手过招就是感觉到不同啊!你这个修改我当我的 V2.0 升版来修改用了,呵呵!

  2. effect
    2010年9月12日10:30 | #2

    QuickPHP :

    哲明牛B,又学习了,和高手过招就是感觉到不同啊!你这个修改我当我的 V2.0 升版来修改用了,呵呵!

    +_+。。 一点了还在啊!

  1. 2011年4月6日22:40 | #1