`
ongsh321
  • 浏览: 101291 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

Js弹出层(支持拖拽,多个弹窗自动切换层级)

阅读更多

Js弹出层

使用方法:

1,首先导入css和js

<script type="text/javascript" src="js/PopUpManager-compressed.js" ></script>
<link href="css/PopUpLayer.css" type="text/css" rel="stylesheet"/>

 

2.

Alert.show(el,modal,dragTitle);
Alert.close(el);

Alert.showIframe(url,width,height,modal);
Alert.closeIframe();

如果在iframe页关闭弹出层,
则是 parent.Alert.close(el);
parent.Alert.closeIframe();

 

PopUpManager.js源码如下:

 

if(typeof EventFactory == "undefinded"){
	alert('aa');
}
var getClient = function(e)
{
	if (e) {
		w = e.clientWidth;
		h = e.clientHeight;
	} else {
		w = (window.innerWidth) ? window.innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : document.body.offsetWidth;
		h = (window.innerHeight) ? window.innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body.offsetHeight;
	}
	return {w:w,h:h};
};

function removeElementById(id){
	var el = document.getElementById(id);
	if(el && el.parentNode) el.parentNode.removeChild(el);
}

var isIE = navigator.userAgent.toLowerCase().indexOf("msie") != -1;
var isIE6 = navigator.userAgent.toLowerCase().indexOf("msie 6.0") != -1;
var isMacXFF = navigator.userAgent.toLowerCase().indexOf('mac')!= -1 && navigator.userAgent.toLowerCase().indexOf('firefox')!=-1;


var Alert = {
	"instance" : null,
	"show" : function(el,modal,dragTitle){
		var len = arguments.length;
		if(len==0 || !el){
			alert('温馨提示:待弹出对象不存在!\n请确认您要弹出的对象在dom中');	
			return;
		}
		if(!this.instance)
		{
			this.instance = new PopUpManager();
		}
		if(typeof el =="string")
		{
			el = document.getElementById(el);	
		}
		if(typeof dragTitle == "string")
		{
			dragTitle = document.getElementById(dragTitle);	
		}
		el.style.display='block';
		this.instance.addPopUp(el,modal,dragTitle);
	},
	"close": function(el){
		if(this.instance){
			try{
				if(el){
					el.style.display="none";
				}else{
					this.instance.removePopUp();
				}
			}catch(e){
				this.instance.currentWin.style.display="none";
			}
		}
	},
	"showIframe": function(url,width,height,modal){
		if(!this.instance)
		{
			this.instance = new PopUpManager();
		}
		this.instance.showIframe(url,width,height,modal);
	},
	"closeIframe": function(){
		if(this.instance){
			this.instance.removeIframe();
		}
	}
}
var Drag={
	"maxDepth":10,
	"currentWin":null,
	"swapList":[],
    "obj":null,
	"init":function(handle, dragBody,swapEnable){
		//自动交换深度
		if(swapEnable != false){
			this.autoSwap(dragBody);
		}
		handle.onmousedown=Drag.start;
		handle.root = dragBody;
		handle.root.onDragStart=new Function();
		handle.root.onDragEnd=new Function();
		handle.root.onDrag=new Function();
	},
	"start":function(e){
		var handle=Drag.obj=this;
		Drag.fixPos(handle.root);
		e=Drag.fixEvent(e);
		var top=parseInt(handle.root.style.top);
		var left=parseInt(handle.root.style.left);
		handle.root.onDragStart(left,top,e.pageX,e.pageY);
		handle.lastMouseX=e.pageX;
		handle.lastMouseY=e.pageY;
		document.onmousemove=Drag.drag;
		document.onmouseup=Drag.end;
		return false;
	},	
	"drag":function(e){
		e=Drag.fixEvent(e);
		var handle=Drag.obj;
		var mouseY=e.pageY;
		var mouseX=e.pageX;
		var top=parseInt(handle.root.style.top);
		var left=parseInt(handle.root.style.left);
		var currentLeft,currentTop;
		currentLeft=left+mouseX-handle.lastMouseX;
		currentTop=top+(mouseY-handle.lastMouseY);
		handle.root.style.left=currentLeft +"px";
		handle.root.style.top=currentTop+"px";
		handle.lastMouseX=mouseX;
		handle.lastMouseY=mouseY;
		handle.root.onDrag(currentLeft,currentTop,e.pageX,e.pageY);//调用外面对应的函数
		return false;
	},
	"end":function(){
		document.onmousemove=null;
		document.onmouseup=null;
		Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style.left),parseInt(Drag.obj.root.style.top));
		Drag.obj=null;
	},
	"fixEvent":function(e){
		if(typeof e=="undefined")e=window.event;
		if(typeof e.layerX=="undefined")e.layerX=e.offsetX;
		if(typeof e.layerY=="undefined")e.layerY=e.offsetY;
		if(typeof e.pageX == "undefined")e.pageX = e.clientX + document.body.scrollLeft - document.body.clientLeft;
		if(typeof e.pageY == "undefined")e.pageY = e.clientY + document.body.scrollTop - document.body.clientTop;
		return e;
	},
	"fixPos":function(e){
		var top,left;
		if(isIE){
			top = e.currentStyle.top;
			left = e.currentStyle.left;
		}else{//此处有小BUG 未计算伪类
			top = window.getComputedStyle(e,null).top;
			left = window.getComputedStyle(e,null).left;
		}
		if(left.indexOf("%") != -1) left = getClient().w * parseInt(left) / 100 ;
		if(top.indexOf("%") != -1) top = getClient().h * parseInt(top) / 100 ;
		top = parseInt(top) || 0;
		left = parseInt(left) || 0;
		e.style.left=left+"px";
		e.style.top=top+"px";
	},
	"autoSwap":function(dragBody){
		
		var zIndex;
		if(isIE){
			zIndex = dragBody.currentStyle.zIndex;
		}else{
			zIndex = window.getComputedStyle(dragBody,null).zIndex;
		}
		if(zIndex>this.maxDepth){
			this.maxDepth = zIndex;
		}
		if(this.swapList.indexOf(dragBody) == -1){
			this.swapList.push(dragBody);
			Drag.addEventListener(dragBody,"mousedown",
				 function(){
					 if(dragBody!=Drag.currentWin && Drag.currentWin){
						 Drag.currentWin.style.zIndex = Drag.maxDepth-1;
						 dragBody.style.zIndex=Drag.maxDepth;
						 Drag.currentWin = dragBody;
					 }else{
						 Drag.currentWin = dragBody;
					 }
				});
		}
	}
};

Drag.addEventListener = function(target, eventName, handler, argsObject)
{
	var eventHandler = handler;
    if(argsObject)
    {
        eventHander = function(e)
        {
            handler.call(argsObject, e);
        }
    }
    if(window.attachEvent)
	{
		target.attachEvent("on" + eventName, eventHandler );
	}else{
		 target.addEventListener(eventName, eventHandler, false);
	}    
}

var PopUpManager = function (){
	this.overlayId = "TB_overlay";
	this.containerId = "TB_window";	
	this.iframeId = "TB_iframe";
	this.IE6OriginalStyle =null;
	if(isMacXFF){ 
		this.overlayClass = "TB_overlayMacFFBGHack";
	}else{ 
		this.overlayClass = "TB_overlayBG";
	}
};

PopUpManager.prototype.addPopUp = function(el,modal,dragTitle)
{
	var instance = this;
	if(!modal){
		this.overlayDiv = this.addLayover();	//添加遮罩层
		this.overlayDiv.onclick = function(){instance.removePopUp();}
		this.addContent(el);
		if(dragTitle)
		{
			var container = document.getElementById(this.containerId);
			Drag.init(dragTitle,container,false);
		}
	}else{
		if(this.currentWin && this.currentWin != el){
			this.currentWin.style.zIndex = Drag.maxDepth-1;
			el.style.zIndex=Drag.maxDepth;
		}
		this.currentWin = el;
		this.centerPopUp(el);
		if(dragTitle)
		{
			Drag.init(dragTitle,el);//可拖拽
		}
	}
	
}

PopUpManager.prototype.showIframe = function(url,width,height,modal)
{	
	width = width || 600;
	height = height || 400;
	var instance = this;
	this.overlayDiv = this.addLayover();	//添加遮罩层
	if(!modal){
		this.overlayDiv.onclick = function(){instance.removeIframe();}
	}
	this.iframe = this.addIframe();
	this.iframe.src = url;
	this.iframe.style.width = width+"px";
	this.iframe.style.height = height+"px";
	this.centerPopUp(this.iframe);
}

PopUpManager.prototype.centerPopUp = function(el)
{
	el.style.display = "block";
	el.style.top = "50%";
	el.style.left = "50%";
	if(isIE6){
		el.style.position = "absolute";
		el.style.marginTop = parseInt(document.documentElement.scrollTop-el.offsetHeight/2,10) + 'px';
	}else{
		el.style.position = "fixed";
		el.style.marginTop = '-'+ parseInt(el.offsetHeight/2,10) + 'px';
	}
	el.style.marginLeft = "-" + parseInt(el.offsetWidth/2,10) + "px";
}

//IE6 private  <iframe id="TB_HideSelect"></iframe>
//MacFF <div id="TB_overlay" class="TB_overlayMacFFBGHack"></div> 
//other <div id="TB_overlay" class="TB_overlayBG"></div>
PopUpManager.prototype.addLayover = function(){
	var overlay = document.getElementById(this.overlayId);
	if(!overlay){
		if(isIE6){
			this.addIE6TemStyle();
			var iframe  = document.createElement("iframe");	
			iframe.id = "TB_HideSelect";
			iframe.frameBorder=0;
			document.body.appendChild(iframe);
		}
		overlay = document.createElement("div");
		overlay.id = this.overlayId;
		overlay.className = this.overlayClass;
		document.body.appendChild(overlay);
	}
	var zIndex;
	if(isIE){
		zIndex = isIE && overlay.currentStyle.zIndex;
	}else{
		zIndex = window.getComputedStyle(overlay,null).zIndex;
	}
	if(zIndex<Drag.maxDepth)
	{
		
	}
	overlay.style.display = "block";
	return overlay;
}

//<div id="TB_window"></div>
PopUpManager.prototype.addContent = function(el){
	var container = document.getElementById(this.containerId);
	if(!container){
		container = document.createElement("div");
		container.id = this.containerId;
		document.body.appendChild(container);
	}
	container.appendChild(el);
	this.centerPopUp(container);
	document.getElementById(this.containerId).style.display = "block";
}
PopUpManager.prototype.addIframe = function()
{
	var iframe = document.getElementById(this.iframeId);
	if(!iframe)
	{
		iframe = document.createElement("iframe");
		iframe.id = this.iframeId;
		iframe.frameBorder = 0;
		document.body.appendChild(iframe);
	}
	return iframe;
}
PopUpManager.prototype.removePopUp = function()
{
		this.removeOverlay();
		this.removeContent();
}
PopUpManager.prototype.removeIframe = function(){
	
	this.removeOverlay();
	removeElementById(this.iframeId);
}

PopUpManager.prototype.removeOverlay = function()
{
	removeElementById(this.overlayId);
	if(isIE6){
		this.removeIE6TemStyle();
		removeElementById("TB_HideSelect");
	}
}

PopUpManager.prototype.removeContent = function()
{
	document.getElementById(this.containerId).style.display = "none";
	//document.body.removeChild(this.container);
}

PopUpManager.prototype.addIE6TemStyle = function()
{
	var htmlEl = document.getElementsByTagName("HTML")[0];
	var bodyEl = document.body;
	
	this.IE6OriginalStyle = {htmlHeight: htmlEl.currentStyle.height,
								htmlWidth: htmlEl.currentStyle.width,
								htmlOverflow: htmlEl.currentStyle.overflow,
								bodyHeight: bodyEl.currentStyle.height,
								bodyWidth: bodyEl.currentStyle.width};
	htmlEl.style.width  = "100%";
	htmlEl.style.height = "100%";
	htmlEl.style.overflow = "hidden";
	bodyEl.style.width = "100%";
	bodyEl.style.height = "100%";/**/
	
}
PopUpManager.prototype.removeIE6TemStyle = function()
{
	if(this.IE6OriginalStyle)
	{
		var htmlEl = document.getElementsByTagName("HTML")[0];
		var bodyEl = document.body;
		htmlEl.style.width = this.IE6OriginalStyle.htmlWidth;
		htmlEl.style.height = this.IE6OriginalStyle.htmlHeight;
		htmlEl.style.overflow = this.IE6OriginalStyle.htmlOverflow;
		bodyEl.style.width = this.IE6OriginalStyle.bodyWidth;
		bodyEl.style.height = this.IE6OriginalStyle.bodyHeight;
	}
}






 

 

分享到:
评论

相关推荐

    支持弹出多个窗口的jQuery弹窗插件

    本文将详细解析"支持弹出多个窗口的jQuery弹窗插件",即popupWindow.js,它是jQuery插件家族中的一个重要成员,主要用于创建具有多种功能的弹出窗口。 首先,popupWindow.js的核心特性是它支持弹出多个窗口,这意味...

    左右多图全屏拖拽以及点击弹窗多图切换效果

    4. **窗口内部图片切换效果**:在弹出的窗口内,用户可以轻松切换多张图片。这通常通过添加导航按钮(如“上一张”、“下一张”)或者滑动效果来实现。可以使用JavaScript数组存储所有要切换的图片源,然后根据用户...

    js弹出层可拖动兼容各大浏览器

    总结来说,"js弹出层可拖动兼容各大浏览器"涉及了JavaScript事件处理、DOM操作、CSS样式兼容、响应式设计以及用户交互优化等多个方面。通过掌握这些技术,开发者能够创建出一个在各种浏览器环境下都能流畅使用的可...

    支持弹出多个窗口的jQuery弹窗插件.zip

    本资源“支持弹出多个窗口的jQuery弹窗插件.zip”是专为网页开发者设计的,旨在帮助他们实现多窗口弹出功能,这在创建交互式网页时非常有用,比如用于展示产品详情、用户提示或登录对话框。 首先,让我们详细了解...

    JavaScript弹出层

    Js弹出层库则是专门为此目的设计的JavaScript库,简化了弹出层的创建和管理过程。在这个场景中,我们关注的是名为"Dialog"的压缩包文件,很可能包含了一个对话框实现的库或者相关的代码示例。 弹出层通常分为几种...

    vue3 拖拽放大缩小弹窗demo

    vue3 拖拽放大缩小弹窗demo

    js弹出框-弹出层-拖拽-兼容

    在这个"js弹出框-弹出层-拖拽-兼容"的插件中,开发者通过纯JavaScript实现了弹出层的创建、拖拽功能的添加,并优化了代码以适应多种浏览器环境。这个插件的价值在于它不需要依赖jQuery或其他大型库,降低了页面加载...

    js弹出层特效点击按钮弹出窗口支持鼠标拖动

    在JavaScript(JS)编程中,弹出层是一种常见的交互设计元素,用于显示额外的信息或功能,而不会离开当前页面。这种技术广泛应用于网页中的警告、确认对话框、模态窗口和自定义信息提示。"js弹出层特效点击按钮弹出...

    漂亮的html弹出层弹出窗口

    "zDrag.js"可能包含拖放功能的实现,允许用户通过鼠标拖动来调整弹出层的位置,增加用户的操作自由度。 "bigform.html"和"test.html"可能是用于测试不同场景下弹出层功能的页面,可能包含了复杂表单或其他交互元素...

    jQuery点击弹出对话框 背景变暗 支持拖拽.rar

    又一个简洁实用的jquery弹出框插件,可实现弹出提示框、弹出引用其他URL框、弹出确认框,可以设置在屏幕中显示的位置(正中间)、设置弹窗事件、添加窗口resize时调整对话框位置,而且还可以拖动层。当弹出浮动...

    jquery弹出层插件点击弹出层可拖动特效

    本案例中提到的插件可能是通过创建一个可浮动的div元素来模拟弹出层效果,并通过jQuery事件监听和DOM操作实现弹出、隐藏以及拖动功能。 拖动特效的实现主要依赖于jQuery的`mousedown`、`mousemove`和`mouseup`事件...

    bootstrap可拖拽弹出层

    这个组件允许用户自定义和拖动弹出窗口,提供了一种非模态(非阻塞)的对话体验,使得用户可以在不关闭当前页面的情况下与弹出层进行交互。这种设计在网页应用中非常常见,例如用于显示详情、编辑表单或提示信息。 ...

    js 弹出层特效点击按钮弹出窗口支持鼠标拖动

    在JavaScript编程领域,"弹出层特效点击按钮弹出窗口支持鼠标拖动"是一个常见的交互设计,用于增强用户体验。这个功能通常应用于各种网页应用中,比如提示信息、表单填写、图片预览等场景。本文件提供的就是一个实现...

    js 弹出窗口 弹出div window 支持遮罩、拖动、嵌入页面、换肤等实用功能

    在本文中,我们将深入探讨如何利用JavaScript实现一个弹出div窗口,包括支持遮罩、拖动、嵌入页面和换肤等功能。 首先,让我们了解“弹出窗口”或“弹出层”的概念。在网页设计中,弹出窗口通常指的是不依赖浏览器...

    js弹出层效果

    通过`&lt;script&gt;`标签引入了一个名为`mask-layer.js`的JavaScript文件,该文件包含了弹出层相关的脚本逻辑。 #### 4. 内联样式与脚本 ```html body { margin: 0 0; } &lt;script type="text/javascript"&gt; // ...

    jQuery LayerModel弹出层插件拖动弹出层效果

    jQuery LayerModel是一款基于jQuery的弹出层插件,它提供了丰富的功能,包括创建各种类型的弹出窗口,如提示、信息、确认、加载等,并且支持弹出层的拖动效果。在网页交互设计中,弹出层是常用的一种增强用户体验的...

    jquery弹出层并可拖动

    4. **封装JS**:为了便于重复使用,你可以将上述代码封装成一个插件或函数,接受参数来定制弹出层的行为,例如位置、内容等。 在提供的压缩包“弹出层并可鼠标拖动”中,包含了实现这一功能的具体文件,你可以通过...

    弹出层拖动DEMO

    总之,“弹出层拖动DEMO”是一个关于如何使用JavaScript实现可拖动弹出层的实例,对于学习网页交互设计和JavaScript事件处理的开发者来说,这是一个很好的学习资源。通过实践这个DEMO,你可以掌握弹出层拖动的核心...

    自制JQuery弹出层插件 PopupDiv-v1.0

    支持弹出层的鼠标拖动移动,该部分用纯js编写执行效率更高 支持ajax加载页面到弹出层 支持一个页面,同时弹出多个层互不干扰 支持模式化弹出,带遮罩层 支持自定义弹出层样式 自带3个事件,开启、关闭、移除 ...

Global site tag (gtag.js) - Google Analytics