`
sunmoonone
  • 浏览: 6288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

比较完备的javacript弹出窗口

阅读更多

不需要任何javascript库,不需要额外加载css,兼容各浏览器,使用方便。

 

可以在初始化或者随时在show的时候设置选项:
是否模态显示
是否可以移动
是否黏着鼠标式的的移动,不用一直按着左键
设置窗口位置
设置窗口大小
是否居中显示
设置标题
设置内容,内容可以是html标签,可以是纯文本
设置关闭动作,是隐藏还是销毁

 

按照面象对象的方法写的,对这种写法感兴趣的朋友可以参考下

涉及到匿名方法,prototye,scope,闭包等,目前没有涉及继承。

 

how to use:
	[] means optional
	
var win=new SimplePopup([options]);
win.show([options]);


your can pass these options to the construtor or the show method:
{
	modal:true,  //show as a modal window or not
	canMove:true, //whether your window can be moved
        glueMouse:true,//if set to true and canMove is true,you can move your window without keeping pressing the mouse
	left:500,	//position
	top:300,	//position
	center:true,//whether to center your window in your explorer. If this option is set to true the left and top option will be ignored
	width:400,  //size
	height:300,	//size
	title:'new title', //the title
	content:'your content',//your content
	closeAction:'hide' //'hide' means hide the window and 'close' means destroy the window. You can not show it again if you close a window
}

原版本见:http://www.sunchis.com/html/js/jssource/2010/0504/152.html

 

 

/**
 * options can be:
 * title
 * width
 * height
 * top
 * left
 * center this option has a hight priority than top and left options
 * content
 * modal
 * canMove
 * glueMouse 
 * closeAction:'close' or 'hide'
 * buttons [NA]
 */
function SimplePopup(options){
	this._init(options);
};

(function(){
function applyStyles(el,obj){
	for (name in obj){
		el.style[name]=obj[name];
	}
}
function isNumber(v){
    return typeof v === 'number' && isFinite(v);
};

function apply(o, c, defaults){
    if(defaults){
        apply(o, defaults);
    }
    if(o && c && typeof c == 'object'){
        for(var p in c){
            o[p] = c[p];
        }
    }
    return o;
};

function getEvent() {
	return window.event || arguments.callee.caller.arguments[0];
};

function dele(method,scope, args, appendArgs){
        return function() {
            var callArgs = args || arguments;
            if (appendArgs === true){
                callArgs = Array.prototype.slice.call(arguments, 0);
                callArgs = callArgs.concat(args);
            }else if (isNumber(appendArgs)){
                callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first
                var applyArgs = [appendArgs, 0].concat(args); // create method call params
                Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
            }
            return method.apply(scope || window, callArgs);
        };
};

apply(SimplePopup.prototype,{
	_init:function(options){
		/**
		 * create window markup:
		 * 
		 * overlay(bgObj) div
		 * <div name='panel'>
		 * 	<table>
		 * 		<tr name='captiontr'>
		 * 			<td name='titlecell'></td><td name='closecell'><span name='closeBtn'></span></td>
		 * 		</tr>
		 * 		<tr><td name='msgBox' colspan=2><div name='contentdiv'></div></td></tr>
		 * 	</table>
		 * </div>
		 */
		var opt=options||{};
		this.options=opt;
		if(opt.canMove===undefined)opt.canMove=true;
		this._minWidth=20;
		this._minHeight=10;
		this._createMoveHandlers();
		var w=opt.width||400,h=opt.height||300;
		this.modal=opt.modal;
		var iWidth = document.documentElement.clientWidth;
		var iHeight = document.documentElement.clientHeight;
		var bgObj = document.createElement("div");
		bgObj.style.width = iWidth+"px";
		bgObj.style.height = Math.max(document.body.clientHeight, iHeight)+"px";
		bgObj.style.display="none";
		document.body.appendChild(bgObj);
		this.overlay=bgObj;
		
		var msgObj=document.createElement("div");
		if(opt.center){
			msgObj.style.top = (iHeight-h)/2+"px";
			msgObj.style.left = (iWidth-w)/2+"px";
		}else{
			msgObj.style.top = (opt.top||"100")+"px";
			msgObj.style.left = (opt.left||"100")+"px";
		}
		msgObj.style.width = w+"px";
		msgObj.style.height = h+"px";
		msgObj.style.display="none";
		document.body.appendChild(msgObj);
		this.panel=msgObj;
	
		var table = document.createElement("table"); 
		this.panel.appendChild(table); 
		var captiontr = table.insertRow(-1); 
		var titlecell = captiontr.insertCell(-1);
		
		this.captionbar=titlecell;
		this.setTitle(opt.title||"please set your title");
		if(opt.canMove){
			this.registerMove();
		}
	
		var closecell = captiontr.insertCell(-1); 
		
		closeBtn = document.createElement("span");
		closeBtn.title="关闭";
		closeBtn.innerHTML="×"
		
		closecell.appendChild(closeBtn);
		if(opt.closeAction=="hide"){
			this.options.closeAction="hide";
			closeBtn.onclick = dele(this.hide,this);
		}else{
			closeBtn.onclick = dele(this.close,this);
			this.options.closeAction="close";
		}
		this.closeButton=closeBtn;
		
		var msgBox = table.insertRow(-1).insertCell(-1); 
		msgBox.style.textAlign="left";
		msgBox.colSpan = "2"; 
		var contentdiv = document.createElement("div"); 
		contentdiv.style.overflow='auto';
		msgBox.appendChild(contentdiv);
		this.contentPanel=contentdiv;
		this.onresize();
		this.setContent(opt.content||"please set your content");
		
		applyStyles(bgObj,{
			"position":"absolute",
			"top":"0px",
			"right":"0px",
			"bottom":"0px",
			"left":"0px",
			"backgroundColor":"#000000",
			"filter":"alpha(opacity=20)",
			"opacity":"0.2", 
			"zIndex":"100"
		});
		applyStyles(msgObj,{
			"border":"#D6D3D6 2px solid",
			"backgroundColor":"#FBF1F7",
			"position":"absolute",
			"textAlign":"center",
			"padding":"0px 0px 0px 0px",
			"lineHeight":"22px",
			"zIndex":"102"
		});
		applyStyles(table,{
			"width":"100%",
			"margin":"0px",
			"border":"0px",
			"padding":"0px",
			"borderSpacing":"0px",
			"borderCollapse":"collapse"
		});
		captiontr.style.background="#56DAD3";
		applyStyles(titlecell,{
			"height":"20px",
			"color":"#250000",
			"textAlign":"left",
			"padding":"3px 3px 3px 1px",
			"margin":"0px",
			"fontWeight":"bold",
			"fontSize":"13px",
			"cursor":"move"
		});
		applyStyles(closecell,{
			"width":"5px",
			"textAlign":"right",
			"padding":"0px",
			"paddingRight":"3px",
			"cursor":"move",
			"margin":"0px"
		});
		applyStyles(closeBtn,{
			"color":"#ffffff",
			"fontSize":"15pt",
			"cursor":"pointer"
		});
	},
	_createMoveHandlers:function(){
		var moveData = {
			startX : 0,
			startY : 0,
			startTop : 0,
			startLeft : 0,
			moving : false,
			mousedown:0,
			docMouseMoveHandler : document.onmousemove,
			docMouseUpHandler : document.onmouseup,
			me:this
		};
		this.onCaptionMousedown=function() {
			var e = getEvent();
			moveData.startX = e.clientX;
			moveData.startY = e.clientY;
			moveData.startTop = parseInt(moveData.me.panel.style.top);
			moveData.startLeft = parseInt(moveData.me.panel.style.left);
			
			if (moveData.me.options.glueMouse){
				if(moveData.mousedown==0){
					moveData.moving=true;
					document.onmousemove =moveData.me.onDocMousemove; 
					moveData.mousedown=1;
				}else{
					document.onmousemove = moveData.docMouseMoveHandler;
					moveData.moving = false;
					moveData.mousedown=0;
				}
			}else{
				moveData.moving = true;
				document.onmousemove =moveData.me.onDocMousemove; 
				document.onmouseup = moveData.me.onDocMouseup;
			}
		};
		this.onDocMousemove=function() {
			if (moveData.moving) {
				var e = getEvent();
				var deltaX = moveData.startLeft + e.clientX - moveData.startX;
				var deltaY = moveData.startTop + e.clientY - moveData.startY;
				if ( deltaX > 0 &&( deltaX +2+ moveData.me.getWidth() < document.documentElement.clientWidth) && 
				deltaY > 0 && (deltaY +2+ moveData.me.getHeight() < document.documentElement.clientHeight) ) {
				
					moveData.me.panel.style.left = deltaX + "px";
					moveData.me.panel.style.top = deltaY + "px";
				} 	
			}
		};
		this.onDocMouseup=function () {
			if (moveData.moving) {
				document.onmousemove = moveData.docMouseMoveHandler;
				document.onmouseup = moveData.docMouseUpHandler;
				moveData.moving = false;
			}
		};
	},
	registerMove:function(){
		try{
		if(!this._movehandlerregistered){
			this.captionbar.onmousedown = this.onCaptionMousedown;
			this._movehandlerregistered=true;
		}}catch(err){alert(err)}
	},
	unRegisterMove:function(){
		if(this._movehandlerregistered){
			this.captionbar.onmousedown = undefined;
			this._movehandlerregistered=false;
		}
	},
	show:function(options){
		this._hideSelectTags();
		if(options){
			if(options.title)this.setTitle(options.title);
			if(options.content)this.setContent(options.content);
			if(isNumber(options.width))this.setWidth(options.width);
			if(isNumber(options.height))this.setHeight(options.height);
			if(options.center){
				this.center();
			}else{
				if(isNumber(options.top))this.setTop(options.top);
				if(isNumber(options.left))this.setLeft(options.left);
			}
			if(options.canMove!==undefined){
				if(options.canMove){
					this.registerMove();
				}else{
					this.unRegisterMove();
				}
			}
			if(options.closeAction&&options.closeAction!=this.options.closeAction){
				if(options.closeAction=="hide"){
					this.closeButton.onclick = dele(this.hide,this);
				}else{
					this.closeButton.onclick = dele(this.close,this);
				}
				this.options.closeAction=options.closeAction;
			}
			if(options.glueMouse!==undefined){
				this.options.glueMouse=options.glueMouse;
			}
		}
		var o=options||{};
		var modal=(o.modal===undefined?this.modal:o.modal);
		if (modal){
			this.overlay.style.display="";
		}else{
			this.overlay.style.display="none";
		}
		this.panel.style.display="";
	},
	hide:function(){
		this._showSelectTags();
		this.overlay.style.display="none";
		this.panel.style.display="none";
	},
	close:function(){
		this._showSelectTags();
		document.body.removeChild(this.overlay); 
		document.body.removeChild(this.panel); 
	},
	_hideSelectTags:function(){
		var sl = document.getElementsByTagName("select");
		this._selects=sl;
		for(var j=0;j<sl.length;j++){
			sl[j].style.display="none";
		}
	},
	_showSelectTags:function(){
		var sl=this._selects;
		if(sl){
			for(var j=0;j<sl.length;j++){
				sl[j].style.display="none";
			}
		}
	},
	setTitle:function(title){
			this.captionbar.innerHTML = title; 
	},
	setContent:function(content){
		this.contentPanel.innerHTML =content;
	},
	setWidth:function(val){
		if(val>=this._minWidth){
			this.panel.style.width=val+"px";
			this.onresize();
		}
	},
	getWidth:function(){
		return parseInt(this.panel.style.width);
	},
	setHeight:function(val){
		if(val>=this._minHeight){
			this.panel.style.height=val+"px";
			this.onresize();
		}
	},
	getHeight:function(){
		return parseInt(this.panel.style.height);
	},
	setTop:function(val){
		if(val>=0&&val+10<= document.documentElement.clientHeight){
		this.panel.style.top=val+"px";
		}
	},
	getTop:function(){
		return parseInt(this.panel.style.top);
	},
	setLeft:function(val){
		if(val>=0&&val+10<=document.documentElement.clientWidth){
		this.panel.style.left=val+"px";
		}
	},
	getLeft:function(){
		return parseInt(this.panel.style.left);
	},
	center:function(){
		this.panel.style.top = (document.documentElement.clientHeight-this.getHeight())/2+"px";
		this.panel.style.left = (document.documentElement.clientWidth-this.getWidth())/2+"px";		
	},
	onresize:function(){
		this.contentPanel.style.width=(this.getWidth()-1)+"px";
		this.contentPanel.style.height=(this.getHeight()-29)+"px";
	}
});
})()
1
2
分享到:
评论

相关推荐

    Ajax右下角弹出窗口

    接下来,我们将深入探讨Ajax的基础知识,以及如何实现一个美观且功能完备的右下角弹出窗口。 首先,了解Ajax(Asynchronous JavaScript and XML)的核心概念是至关重要的。Ajax并不是一种单一的技术,而是一组用于...

    flex 弹出窗口并居中显示

    综上所述,通过Flex布局,我们可以轻松实现弹出窗口的居中显示,同时结合其他CSS和JavaScript技巧,可以打造出功能完备、用户体验良好的弹出窗口。在实际项目中,还可以根据需求进行更复杂的定制和优化。

    弹页面窗口

    在网页设计和开发中,"弹页面窗口"是一种常见的用户交互功能,主要用于显示登录表单、消息提示...通过理解和运用这些知识点,开发者可以构建出功能完备且具有良好用户体验的弹出窗口功能,满足登录表单或其他交互需求。

    JQuery弹出恒定居中的窗口

    综上所述,这个项目展示了如何使用jQuery和CSS来创建一个功能完备、视觉友好的弹出窗口插件,涉及到的技术点包括:jQuery插件开发、CSS布局(尤其是居中对齐)、DOM操作、事件处理以及跨浏览器兼容性解决方案。...

    如何在Bootstrap弹出窗口中插入关闭按钮.docx

    在Bootstrap框架中,弹出窗口(Popover)是一种非常有用的功能,它允许你在页面元素上创建交互式的提示信息。...通过以上步骤,你可以在Bootstrap弹出窗口中实现一个功能完备、样式美观的关闭按钮,提升用户体验。

    ymPrompt4.0 JS 弹出窗 拖动层

    总的来说,ymPrompt4.0是一个功能完备且可高度定制的JavaScript弹出窗口解决方案,适用于各种网页应用。通过合理的配置和使用,开发者可以轻松创建出美观、易用且具有拖动功能的弹出层,提高网站的交互性和用户友好...

    HTML制作模式窗体_弹出不确定就不让点后边的窗口.zip

    在"HTML制作模式窗体_弹出不确定就不让点后边的窗口.zip"这个压缩包中,我们可以看到几个关键资源: 1. **对话框.png**:这可能是对话框设计的示例图片,展示了一个典型的模式对话框的外观,包括标题、内容区域、...

    jquery+js+html实现弹出登录窗口

    在实现弹出登录窗口时,jQuery提供了方便的API来操作DOM元素,如`$("#elementId")`用于选取指定ID的元素,`.show()`和`.hide()`控制元素的显示与隐藏,`.fadeIn()`和`.fadeOut()`则可以实现平滑的显示和消失效果。...

    jQuery+jqmodal弹出窗口实现代码分明

    在本篇文章中,我们将详细探讨如何使用jQuery及其扩展插件jqmodal来实现一个功能完备、样式美观的弹出窗口。首先,要实现这一功能,需要先了解几个关键知识点:jQuery基础、jqmodal插件的工作机制、以及CSS样式的...

    js弹出层暂停实现模式窗口效果(修改后的)

    在JavaScript编程中,"弹出层"通常指的是在网页中临时显示信息或进行交互的浮动窗口,例如模态对话框。这种效果可以用于提示用户、获取输入或者展示详细信息。"暂停实现"意味着我们希望在弹出层打开时,阻止用户与...

    highslide-4.1.9 非常好的 弹出div 图片浏览js

    用户可以通过点击缩略图或者链接来触发弹出窗口,同时,弹出窗口还支持关闭按钮和键盘导航,提高了用户体验。 图片幻灯和幻灯片功能是Highslide的一大亮点。它可以将一组图片组织成一个连续的展示序列,用户可以...

    弹出层选项卡

    弹出层选项卡在此基础上增加了一个特性,即当用户触发特定操作(如点击按钮)时,选项卡内容以弹出窗口的形式呈现,不影响页面主体内容。 2. **HTML结构**:创建弹出层选项卡通常涉及HTML的`&lt;div&gt;`元素,用于构建每...

    Drop.js-实用的JavaScript下拉弹出层插件

    **Drop.js - 实用的JavaScript下拉弹出层插件** Drop.js 是一款高效且功能丰富的JavaScript和CSS插件,专为创建各种下拉弹出层而设计。它利用了Tether.js的强大定位功能,确保弹出层在页面上无论在任何情况下都能...

    一个简单好用的弹出层

    1. **定义与用途**:弹出层(Modal)是一种浮动窗口,它覆盖在网页主要内容之上,以吸引用户注意力并提供额外的功能或信息。常见的应用场景包括登录/注册表单、消息提示、图片预览、选项设置等。 2. **实现技术**:...

    javascript经典特效---定制打开的窗口.rar

    在这个特定的案例中,我们关注的是"定制打开的窗口",这可能指的是创建自定义对话框、模态框或者弹出窗口等元素,它们在用户进行特定操作时出现,提供额外的信息或交互功能。 JavaScript是一种广泛用于客户端Web...

    js弹出div效果

    当我们说“弹出div”,就是指让一个元素在页面上以弹出窗口的形式出现。 实现js弹出div效果,通常包括以下几个步骤: 1. **创建元素**:在HTML文档中定义一个元素,并为其设置相应的ID以便在JavaScript中引用。...

    jquery弹出层带关闭按钮

    "jquery弹出层带关闭按钮"这个主题涉及到的是使用jQuery来创建具有关闭功能的弹出窗口,这在网页交互设计中是非常常见的需求。下面将详细解释如何实现这一功能。 首先,我们需要理解什么是弹出层(Popup Layer)。...

    商业编程-源码-仿迅雷博客弹出登录窗口.zip

    【标题】"商业编程-源码-仿迅雷博客弹出登录窗口.zip"指的是一个包含源代码的压缩文件,...通过学习和应用这些知识点,开发者可以构建出一个功能完备、用户体验良好且安全的商业登录系统,类似迅雷博客的弹出登录窗口。

    jquery弹出层

    在Web开发中,弹出层是一种常见的交互元素,它能够以非侵入式的方式展示信息,如警告、确认对话框、模态窗口等。jQuery,作为一个广泛使用的JavaScript库,提供了丰富的功能来实现弹出层效果。本篇将深入探讨jQuery...

Global site tag (gtag.js) - Google Analytics