封装的原生javascript弹出层代码


Posted in Javascript onSeptember 24, 2010
<script type="text/javascript">// <![CDATA[ 
/* @author: hongru.chen 
** @date: 2010-09-15 
** @vision: 1.1 
*/ 
var Hongru = {}; 
function $(id){return document.getElementById(id)} 
Object.prototype.extend = function(target, /*optional*/source, /*optional*/deep) { 
target = target || {}; 
var sType = typeof source, i = 1, options; 
if( sType === 'undefined' || sType === 'boolean' ) { 
deep = sType === 'boolean' ? source : false; 
source = target; 
target = this; 
} 
if( typeof source !== 'object' && Object.prototype.toString.call(source).call(source) !== '[object Function]' ) 
source = {}; while(i <= 2) { 
options = i === 1 ? target : source; 
if( options != null ) { 
for( var name in options ) { 
var src = target[name], copy = options[name]; 
if(target === copy) 
continue; 
if(deep && copy && typeof copy === 'object' && !copy.nodeType) 
target[name] = this.extend(src || 
(copy.length != null ? [] : {}), copy, deep); 
else if(copy !== undefined) 
target[name] = copy; 
} 
} 
i++; 
} 
return target; 
}; 
isFunction = function( fn ) { 
return !!fn && typeof fn != "string" && !fn.nodeName && 
fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); 
} 
Hongru.box = function(){ 
var box,mask,content,_content,_height,_width,isPreload,flag = false; 
return{ 
open:function(con,options){ 
//default options 
var defaultOptions = { 
width:300, 
height:200, 
isPre:true, 
time:0, 
title:'对话框', 
isBar:true, 
isShut:true 
}; 
options = options?options:{}; 
options = Object.extend(defaultOptions,options); 
if(!flag){ 
box = document.createElement('div');box.id = "popup-box"; 
box.style.cssText = "position:absolute; display:none; background:#fff url(preload.gif) no-repeat 50% 50%; border:5px solid #ccc; z-index:2000"; 
mask = document.createElement('div');mask.id = "popup-mask"; 
mask.style.cssText = "position:absolute; display:none; top:0; left:0; height:100%; width:100%; background:#000; z-index:1500"; 
content = document.createElement('div');content.id = "popup-content"; 
content.style.cssText = "background:#fff"; 
bar = document.createElement('div'); bar.id = "popup-bar"; 
bar.style.cssText = "background:none repeat scroll 0 0 #F7F7F7;border-bottom:4px solid #EEEEEE;border-top:3px solid #F9F9F9;margin-top:2px;position:relative"; 
wrapTit = document.createElement('div'); wrapTit.id = "wrap-tit"; 
wrapTit.style.cssText = "background:none repeat scroll 0 0 #F3F3F3;border-bottom:5px solid #F1F1F1;border-top:4px solid #F5F5F5;line-height:5px;margin-top:3px;"; 
tit = document.createElement('span'); tit.id = "popup-tit"; 
tit.style.cssText = "cursor:text;margin-left:10px;position:relative;color:#333;font-size:84%" 
shut = document.createElement('a'); shut.id = "popup-shut"; 
shut.innerHTML = '×'; 
shut.style.cssText = "color:#34538B;cursor:pointer;font-family:Tahoma;font-weight:bold;position:absolute;top:0px;right:10px;text-decoration:none;"; 
document.body.appendChild(mask); document.body.appendChild(box); box.appendChild(bar); box.appendChild(content); bar.appendChild(wrapTit); bar.appendChild(shut); wrapTit.appendChild(tit); 
mask.onclick = shut.onclick = Hongru.box.hide; 
//bar.onclick = function(){alert($('sure').id)} 
window.onresize = Hongru.box.resize; 
flag = true; 
}tit.innerHTML = options.title; 
options.isShut?shut.style.display = '':shut.style.display = 'none'; 
options.isBar?bar.style.display = '':bar.style.display = 'none'; 
if(!options.isPre){ 
box.style.width = options.width?options.width+'px':'auto'; 
box.style.height = options.height?options.height+'px':'auto'; 
box.style.backgroundImage = 'none'; 
content.innerHTML = con; 
} 
else{ 
content.style.display = 'none'; 
box.style.width = box.style.height = '100px'; 
} 
this.mask(); 
this.alpha(mask,1,50); 
_content = con; _height = options.height; _width = options.width; isPreload = options.isPre; 
if(options.time){ 
setTimeout(function(){Hongru.box.hide()},1000*options.time); 
} 
}, 
fill:function(con,options){ 
if(options.isPre){ 
if(!options.width || !options.height){ 
var autoWidth = box.style.width, autoHeight = box.style.height; 
content.innerHTML = con; 
box.style.width = options.width?options.width+'px':''; 
box.style.height = options.height?options.height+'px':''; 
content.style.display = ''; 
options.width = parseInt(box.offsetWidth-10); 
options.height = parseInt(box.offsetHeight-10); 
content.style.display = 'none'; 
box.style.width = autoWidth; 
box.style.height = autoHeight; 
} 
else{ 
content.innerHTML = con; 
} 
this.size(box,options.width,options.height); 
} 
else{ 
box.style.backgroundImage = 'none'; 
} 
}, 
hide:function(){ 
Hongru.box.alpha(box,-1,0); 
}, 
resize:function(){ 
Hongru.box.pos(); 
Hongru.box.mask(); 
}, 
mask:function(){ 
mask.style.height = Hongru.page.total(1)+'px'; 
mask.style.width=''; mask.style.width = Hongru.page.total(0)+'px'; 
}, 
pos:function(){ 
var minTop = (Hongru.page.height()/2)-(box.offsetHeight/2); minTop = minTop<10?10:minTop; 
box.style.top=(minTop+Hongru.page.top())+'px'; 
box.style.left=(Hongru.page.width()/2)-(box.offsetWidth/2)+'px'; 
}, 
alpha:function(obj,direction,destination){ 
clearInterval(obj.animing); 
if(direction == 1){ 
obj.style.opacity=0; obj.style.filter='alpha(opacity=0)'; 
obj.style.display='block'; this.pos(); 
} 
obj.animing = setInterval(function(){Hongru.box.alphaAnim(obj,destination,direction)},50); 
}, 
alphaAnim:function(obj,destination,direction){ 
var opacity = Math.round(obj.style.opacity*100); 
if(opacity == destination){ 
clearInterval(obj.animing); 
if(direction == -1){ 
obj.style.display='none'; 
obj == box?Hongru.box.alpha(mask,-1,0):content.innerHTML=box.style.backgroundImage=''; 
}else{ 
curOptions = {width:_width,height:_height,isPre:isPreload} 
obj == mask?this.alpha(box,1,100):Hongru.box.fill(_content,curOptions); 
} 
}else{ 
var n=Math.ceil((opacity+((destination-opacity)*.5))); n=n==1?0:n; 
obj.style.opacity=n/100; 
obj.style.filter='alpha(opacity='+n+')'; 
} 
}, 
size:function(obj,width,height){ 
obj = typeof obj == 'object' ? obj : $(obj); 
clearInterval(obj.sizing); 
var offsetW = obj.offsetWidth, offsetH = obj.offsetHeight, 
otherW = offsetW-parseInt(obj.style.width), otherH = offsetH-parseInt(obj.style.height); 
var wFlag = (offsetW-otherW>width)?0:1, hFlag = (offsetH-otherH>height)?0:1; 
obj.sizing = setInterval(function(){Hongru.box.sizeAnim(obj,width,otherW,wFlag,height,otherH,hFlag)},20); 
}, 
sizeAnim:function(obj,width,otherW,wFlag,height,otherH,hFlag){ 
var objW = obj.offsetWidth-otherW, objH = obj.offsetHeight-otherH; 
if(objW == width && objH == height){ 
clearInterval(obj.sizing); 
box.style.backgroundImage='none'; 
content.style.display='block'; 
}else{ 
if(objW!=width){ 
var n = objW+((width-objW)*.5); 
obj.style.width = wFlag?Math.ceil(n)+'px':Math.floor(n)+'px'; 
} 
if(objH!=height){ 
var n = objH+((height-objH)*.5); 
obj.style.height = hFlag?Math.ceil(n)+'px':Math.floor(n)+'px'; 
} 
this.pos(); 
} 
}, 
ask:function(message,options,sureCall,cancelCall){ 
var elements = '<div class="wrap-remind" style="text-align:center">'+message+'<p><button id="sure-btn" class="sure-btn">确认</button>  <button id="cancel-btn" class="cancel-btn">取消</button></p></div>'; 
Hongru.box.open(elements,options); 
function delay(){//回调 
if(($('sure-btn') && $('cancel-btn')) != null){ 
clearInterval(checkComplete); 
//alert('yes'); 
$('sure-btn').onclick = function(){ 
if(isFunction(sureCall)){sureCall.call(this);} 
} 
$('cancel-btn').onclick = function(){ 
if(isFunction(cancelCall)){cancelCall.call(this);} 
Hongru.box.hide(); 
} 
}} 
var checkComplete = setInterval(delay,100); 
} 
} 
}(); 
Hongru.page=function(){ 
return{ 
top:function(){return document.documentElement.scrollTop||document.body.scrollTop}, 
width:function(){return self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth}, 
height:function(){return self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}, 
total:function(d){ 
var b=document.body, e=document.documentElement; 
return d?Math.max(Math.max(b.scrollHeight,e.scrollHeight),Math.max(b.clientHeight,e.clientHeight)): 
Math.max(Math.max(b.scrollWidth,e.scrollWidth),Math.max(b.clientWidth,e.clientWidth)) 
} 
} 
}(); 
// ]]></script>

不设任何options参数的box(默认高200px,宽300px)
普通设定高宽的box
高宽自适应内容高宽的box
不带预载动画的box
延迟自动消失的box
title自定义的box
不带标题栏的的box
不带标题栏关闭按钮的box
带按钮和回调参数的box

调用 Hongru.box.open(con,options)函数,参数con为弹出层主要内容,可以是html代码。options为一个object,可选参数目前有

{ 
width:300 //自定义,弹出层主体(除边框和标题栏的宽度),为0时自适应。 
height:200//自定义,弹出层主体(除边框和标题栏的高度),为0时自适应。 
isPre:1 //true or false,是否有预加载背景图, 
time:0 //延迟自动关闭时间,秒为单位,0时不触发 
title:'' //自定义title 
isBar:1 //true or false,是否有标题栏 
isShut:1 //是否有关闭按钮 
}

另 Hongru.box.ask(con,options,surecall,cancelcall)为带按钮的提示框,带回调函数前两个参数同上,后两个参数分别为‘确认'和‘取消'的回调函数
其中加入了透明度渐变和大小渐变,透明度渐变主体函数如下:
show sourceview sourceprint?alphaAnim:function(obj,destination,direction){ 
var opacity = Math.round(obj.style.opacity*100); 
if(opacity == destination){ 
clearInterval(obj.animing); 
if(direction == -1){ 
obj.style.display='none'; 
obj == box?Hongru.box.alpha(mask,-1,0):content.innerHTML=box.style.backgroundImage=''; 
}else{ 
curOptions = {width:_width,height:_height,isPre:isPreload} 
obj == mask?this.alpha(box,1,100):Hongru.box.fill(_content,curOptions); 
} 
}else{ 
var n=Math.ceil((opacity+((destination-opacity)*.5))); n=n==1?0:n; 
obj.style.opacity=n/100; 
obj.style.filter='alpha(opacity='+n+')'; 
} 
},

box大小渐变函数体如下:
show sourceview sourceprint?sizeAnim:function(obj,width,otherW,wFlag,height,otherH,hFlag){ 
var objW = obj.offsetWidth-otherW, objH = obj.offsetHeight-otherH; 
if(objW == width && objH == height){ 
clearInterval(obj.sizing); 
box.style.backgroundImage='none'; 
content.style.display='block'; 
}else{ 
if(objW!=width){ 
var n = objW+((width-objW)*.5); 
obj.style.width = wFlag?Math.ceil(n)+'px':Math.floor(n)+'px'; 
} 
if(objH!=height){ 
var n = objH+((height-objH)*.5); 
obj.style.height = hFlag?Math.ceil(n)+'px':Math.floor(n)+'px'; 
} 
this.pos(); 
} 
},

好了,废话不多说了,附上源文件打包下载:狠狠点击这里
如果觉得不错,请移驾点下 下面 的推荐
Javascript 相关文章推荐
JavaScipt基本教程之JavaScript语言的基础
Jan 16 Javascript
js单词形式的运算符
May 06 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
js的[defer]和[async]属性
Nov 24 Javascript
基于豆瓣API+Angular开发的web App
Jan 02 Javascript
AngularJS基础学习笔记之控制器
May 10 Javascript
ES6的新特性概览
Mar 10 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
Jul 03 Javascript
通过命令行创建vue项目的方法
Jul 20 Javascript
详解利用Angular实现多团队模块化SPA开发框架
Nov 27 Javascript
CKEditor4配置与开发详细中文说明文档
Oct 08 Javascript
js最简单的拖拽效果实现代码
Sep 24 #Javascript
JavaScript 设计模式 安全沙箱模式
Sep 24 #Javascript
IE无法设置短域名下Cookie
Sep 23 #Javascript
Javascript中获取出错代码所在文件及行数的代码
Sep 23 #Javascript
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 #Javascript
用js模拟JQuery的show与hide动画函数代码
Sep 20 #Javascript
通过DOM脚本去设置样式信息
Sep 19 #Javascript
You might like
php 字符串替换的方法
2012/01/10 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
Python深入学习之装饰器
2014/08/31 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
人事行政主管岗位职责
2013/12/22 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
党支部工作总结2015
2015/04/01 职场文书
开业庆典致辞
2015/08/01 职场文书
怎样写好工作计划
2019/04/10 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js