Welcome 微信登录

首页 / 脚本样式 / JavaScript / JavaScript写的一个自定义弹出式对话框代码

下图是我的设计思路

下面是具体的js代码
1,首先定义几个自定义函数
代码
复制代码 代码如下:
//判断是否为数组
function isArray(v)
{
return v && typeof v.length == "number" && typeof v.splice == "function";
}
//创建元素
function createEle(tagName)
{
return document.createElement(tagName);
}
//在body中添加子元素
function appChild(eleName)
{
return document.body.appendChild(eleName);
}
//从body中移除子元素
function remChild(eleName)
{
return document.body.removeChild(eleName);
}

2,具体的窗体实现代码
代码
复制代码 代码如下:
//弹出窗口,标题(html形式)、html、宽度、高度、是否为模式对话框(true,false)、按钮(关闭按钮为默认,格式为["按钮1",fun1,"按钮2",fun2]数组形式,前面为按钮值,后面为按钮onclick事件)
function showWindow(title,html,width,height,modal,buttons)
{
//避免窗体过小
if (width < 300)
{
width = 300;
}
if (height < 200)
{
height = 200;
}
//声明mask的宽度和高度(也即整个屏幕的宽度和高度)
var w,h;
//可见区域宽度和高度
var cw = document.body.clientWidth;
var ch = document.body.clientHeight;
//正文的宽度和高度
var sw = document.body.scrollWidth;
var sh = document.body.scrollHeight;
//可见区域顶部距离body顶部和左边距离
var st = document.body.scrollTop;
var sl = document.body.scrollLeft;
w = cw > sw ? cw:sw;
h = ch > sh ? ch:sh;
//避免窗体过大
if (width > w)
{
width = w;
}
if (height > h)
{
height = h;
}
//如果modal为true,即模式对话框的话,就要创建一透明的掩膜
if (modal)
{
var mask = createEle("div");
mask.style.cssText = "position:absolute;left:0;top:0px;background:#fff;filter:Alpha(Opacity=30);opacity:0.5;z-index:10000;width:" + w + "px;height:" + h + "px;";
appChild(mask);
}
//这是主窗体
var win = createEle("div");
win.style.cssText = "position:absolute;left:" + (sl + cw/2 - width/2) + "px;top:" + (st + ch/2 - height/2) + "px;background:#f0f0f0;z-index:10001;width:" + width + "px;height:" + height + "px;border:solid 2px #afccfe;";
//标题栏
var tBar = createEle("div");
//afccfe,dce8ff,2b2f79
tBar.style.cssText = "margin:0;width:" + width + "px;height:25px;background:url(top-bottom.png);cursor:move;";
//标题栏中的文字部分
var titleCon = createEle("div");
titleCon.style.cssText = "float:left;margin:3px;";
titleCon.innerHTML = title;//firefox不支持innerText,所以这里用innerHTML
tBar.appendChild(titleCon);
//标题栏中的“关闭按钮”
var closeCon = createEle("div");
closeCon.style.cssText = "float:right;width:20px;margin:3px;cursor:pointer;";//cursor:hand在firefox中不可用
closeCon.innerHTML = "×";
tBar.appendChild(closeCon);
win.appendChild(tBar);
//窗体的内容部分,CSS中的overflow使得当内容大小超过此范围时,会出现滚动条
var htmlCon = createEle("div");
htmlCon.style.cssText = "text-align:center;width:" + width + "px;height:" + (height - 50) + "px;overflow:auto;";
htmlCon.innerHTML = html;
win.appendChild(htmlCon);
//窗体底部的按钮部分
var btnCon = createEle("div");
btnCon.style.cssText = "width:" + width + "px;height:25px;text-height:20px;background:url(top-bottom.png);text-align:center;padding-top:3px;";
//如果参数buttons为数组的话,就会创建自定义按钮
if (isArray(buttons))
{
var length = buttons.length;
if (length > 0)
{
if (length % 2 == 0)
{
for (var i = 0; i < length; i = i + 2)
{
//按钮数组
var btn = createEle("button");
btn.innerHTML = buttons[i];//firefox不支持value属性,所以这里用innerHTML
// btn.value = buttons[i];
btn.onclick = buttons[i + 1];
btnCon.appendChild(btn);
//用户填充按钮之间的空白
var nbsp = createEle("label");
nbsp.innerHTML = "  ";
btnCon.appendChild(nbsp);
}
}
}
}
//这是默认的关闭按钮
var btn = createEle("button");
// btn.setAttribute("value","关闭");
btn.innerHTML = "关闭";
// btn.value = "关闭";
btnCon.appendChild(btn);
win.appendChild(btnCon);
appChild(win);
/*************************************以下为拖动窗体事件*********************/
//鼠标停留的X坐标
var mouseX = 0;
//鼠标停留的Y坐标
var mouseY = 0;
//窗体到body顶部的距离
var toTop = 0;
//窗体到body左边的距离
var toLeft = 0;
//判断窗体是否可以移动
var moveable = false;
//标题栏的按下鼠标事件
tBar.onmousedown = function()
{
var eve = getEvent();
moveable = true;
mouseX = eve.clientX;
mouseY = eve.clientY;
toTop = parseInt(win.style.top);
toLeft = parseInt(win.style.left);
//移动鼠标事件
tBar.onmousemove = function()
{
if(moveable)
{
var eve = getEvent();
var x = toLeft + eve.clientX - mouseX;
var y = toTop + eve.clientY - mouseY;
if (x > 0 && (x + width < w) && y > 0 && (y + height < h))
{
win.style.left = x + "px";
win.style.top = y + "px";
}
}
}
//放下鼠标事件,注意这里是document而不是tBar
document.onmouseup = function()
{
moveable = false;
}
}
//获取浏览器事件的方法,兼容ie和firefox
function getEvent()
{
return window.event || arguments.callee.caller.arguments[0];
}
//顶部的标题栏和底部的按钮栏中的“关闭按钮”的关闭事件
btn.onclick = closeCon.onclick = function()
{
remChild(win);
remChild(mask);
}
}

实例调用
复制代码 代码如下:
str = "看看我的窗体效果";
showWindow("我的提示框",str,850,250,true,["地区",fun1,"矿种",fun2]);

更为完整实用的代码,包括定义和调用
代码
复制代码 代码如下:
<html>
<head><title>自定义弹出对话框</title>
<style type ="text/css" >
.layout
{
width:2000px;
height:400px;
border:solid 1px red;
text-align:center;
}
</style>
<script type="text/javascript">
//判断是否为数组
function isArray(v)
{
return v && typeof v.length == "number" && typeof v.splice == "function";
}
//创建元素
function createEle(tagName)
{
return document.createElement(tagName);
}
//在body中添加子元素
function appChild(eleName)
{
return document.body.appendChild(eleName);
}
//从body中移除子元素
function remChild(eleName)
{
return document.body.removeChild(eleName);
}
//弹出窗口,标题(html形式)、html、宽度、高度、是否为模式对话框(true,false)、按钮(关闭按钮为默认,格式为["按钮1",fun1,"按钮2",fun2]数组形式,前面为按钮值,后面为按钮onclick事件)
function showWindow(title,html,width,height,modal,buttons)
{
//避免窗体过小
if (width < 300)
{
width = 300;
}
if (height < 200)
{
height = 200;
}
//声明mask的宽度和高度(也即整个屏幕的宽度和高度)
var w,h;
//可见区域宽度和高度
var cw = document.body.clientWidth;
var ch = document.body.clientHeight;
//正文的宽度和高度
var sw = document.body.scrollWidth;
var sh = document.body.scrollHeight;
//可见区域顶部距离body顶部和左边距离
var st = document.body.scrollTop;
var sl = document.body.scrollLeft;
w = cw > sw ? cw:sw;
h = ch > sh ? ch:sh;
//避免窗体过大
if (width > w)
{
width = w;
}
if (height > h)
{
height = h;
}
//如果modal为true,即模式对话框的话,就要创建一透明的掩膜
if (modal)
{
var mask = createEle("div");
mask.style.cssText = "position:absolute;left:0;top:0px;background:#fff;filter:Alpha(Opacity=30);opacity:0.5;z-index:100;width:" + w + "px;height:" + h + "px;";
appChild(mask);
}
//这是主窗体
var win = createEle("div");
win.style.cssText = "position:absolute;left:" + (sl + cw/2 - width/2) + "px;top:" + (st + ch/2 - height/2) + "px;background:#f0f0f0;z-index:101;width:" + width + "px;height:" + height + "px;border:solid 2px #afccfe;";
//标题栏
var tBar = createEle("div");
//afccfe,dce8ff,2b2f79
tBar.style.cssText = "margin:0;width:" + width + "px;height:25px;background:url(top-bottom.png);cursor:move;";
//标题栏中的文字部分
var titleCon = createEle("div");
titleCon.style.cssText = "float:left;margin:3px;";
titleCon.innerHTML = title;//firefox不支持innerText,所以这里用innerHTML
tBar.appendChild(titleCon);
//标题栏中的“关闭按钮”
var closeCon = createEle("div");
closeCon.style.cssText = "float:right;width:20px;margin:3px;cursor:pointer;";//cursor:hand在firefox中不可用
closeCon.innerHTML = "×";
tBar.appendChild(closeCon);
win.appendChild(tBar);
//窗体的内容部分,CSS中的overflow使得当内容大小超过此范围时,会出现滚动条
var htmlCon = createEle("div");
htmlCon.style.cssText = "text-align:center;width:" + width + "px;height:" + (height - 50) + "px;overflow:auto;";
htmlCon.innerHTML = html;
win.appendChild(htmlCon);
//窗体底部的按钮部分
var btnCon = createEle("div");
btnCon.style.cssText = "width:" + width + "px;height:25px;text-height:20px;background:url(top-bottom.png);text-align:center;padding-top:3px;";
//如果参数buttons为数组的话,就会创建自定义按钮
if (isArray(buttons))
{
var length = buttons.length;
if (length > 0)
{
if (length % 2 == 0)
{
for (var i = 0; i < length; i = i + 2)
{
//按钮数组
var btn = createEle("button");
btn.innerHTML = buttons[i];//firefox不支持value属性,所以这里用innerHTML
// btn.value = buttons[i];
btn.onclick = buttons[i + 1];
btnCon.appendChild(btn);
//用户填充按钮之间的空白
var nbsp = createEle("label");
nbsp.innerHTML = "  ";
btnCon.appendChild(nbsp);
}
}
}
}
//这是默认的关闭按钮
var btn = createEle("button");
// btn.setAttribute("value","关闭");
btn.innerHTML = "关闭";
// btn.value = "关闭";
btnCon.appendChild(btn);
win.appendChild(btnCon);
appChild(win);
/******************************************************以下为拖动窗体事件************************************************/
//鼠标停留的X坐标
var mouseX = 0;
//鼠标停留的Y坐标
var mouseY = 0;
//窗体到body顶部的距离
var toTop = 0;
//窗体到body左边的距离
var toLeft = 0;
//判断窗体是否可以移动
var moveable = false;
//标题栏的按下鼠标事件
tBar.onmousedown = function()
{
var eve = getEvent();
moveable = true;
mouseX = eve.clientX;
mouseY = eve.clientY;
toTop = parseInt(win.style.top);
toLeft = parseInt(win.style.left);
//移动鼠标事件
tBar.onmousemove = function()
{
if(moveable)
{
var eve = getEvent();
var x = toLeft + eve.clientX - mouseX;
var y = toTop + eve.clientY - mouseY;
if (x > 0 && (x + width < w) && y > 0 && (y + height < h))
{
win.style.left = x + "px";
win.style.top = y + "px";
}
}
}
//放下鼠标事件,注意这里是document而不是tBar
document.onmouseup = function()
{
moveable = false;
}
}
//获取浏览器事件的方法,兼容ie和firefox
function getEvent()
{
return window.event || arguments.callee.caller.arguments[0];
}
//顶部的标题栏和底部的按钮栏中的“关闭按钮”的关闭事件
btn.onclick = closeCon.onclick = function()
{
remChild(win);
if (mask)
{
remChild(mask);
}
}
}
function addCheckbox(name,value,id,click)
{
var str = "<input type="checkbox" name="" + name + "" value="" + value + "" id="" + id + "" onclick="" + (click == null ? "":click) + ""/> <label for="" + id + "">" + value + "</label>";
return str;
}
function show()
{
var str = "<div><div style="border:dotted 1px blue"><table cellspacing="2">";
str += "<tr><td colspan="7" style="text-align:center">请选择所在地区:" + addCheckbox("all","全(不)选","cities_all","selectAll(this,"cities_cb")") + "</td></tr>";
str += "<tr><td>" + addCheckbox("cities_cb","长沙市","cities_cb1") + "</td><td>" + addCheckbox("cities_cb","株洲市","cities_cb2") + "</td><td>" + addCheckbox("cities_cb","湘潭市","cities_cb3") + "</td><td>" + addCheckbox("cities_cb","衡阳市","cities_cb4") + "</td><td>" + addCheckbox("cities_cb","益阳市","cities_cb5") + "</td>";
str += "<td>" + addCheckbox("cities_cb","常德市","cities_cb6") + "</td><td>" + addCheckbox("cities_cb","岳阳市","cities_cb7") + "</td></tr>";
str += "<tr><td>" + addCheckbox("cities_cb","邵阳市","cities_cb8") + "</td><td>" + addCheckbox("cities_cb","郴州市","cities_cb9") + "</td><td>" + addCheckbox("cities_cb","娄底市","cities_cb10") + "</td>";
str += "<td>" + addCheckbox("cities_cb","永州市","cities_cb11") + "</td><td>" + addCheckbox("cities_cb","怀化市","cities_cb12") + "</td><td>" + addCheckbox("cities_cb","张家界市","cities_cb13") + "</td><td>" + addCheckbox("cities_cb","湘西自治州","cities_cb14") + "</td></tr>";
str += "</table></div><br/><div style="border:dotted 1px blue"><table cellspacing="2">";
str += "<tr><td colspan="10" style="text-align:center">请选择矿种:" + addCheckbox("all","全(不)选","class_all","selectAll(this,"class_cb")") + "</td></tr>";
str += "<tr><td>" + addCheckbox("class_cb","铋","class_cb1") + "</td><td>" + addCheckbox("class_cb","钒","class_cb2") + "</td><td>" + addCheckbox("class_cb","金","class_cb3") + "</td><td>" + addCheckbox("class_cb","煤","class_cb4") + "</td><td>" + addCheckbox("class_cb","锰","class_cb5") + "</td><td>" + addCheckbox("class_cb","钼","class_cb6") + "</td><td>" + addCheckbox("class_cb","铅","class_cb7") + "</td><td>" + addCheckbox("class_cb","石膏","class_cb8") + "</td><td>" + addCheckbox("class_cb","石煤","class_cb9") + "</td><td>" + addCheckbox("class_cb","锑","class_cb10") + "</td></tr>";
str += "<tr><td>" + addCheckbox("class_cb","铁","class_cb11") + "</td><td>" + addCheckbox("class_cb","铜","class_cb12") + "</td><td>" + addCheckbox("class_cb","钨","class_cb13") + "</td><td>" + addCheckbox("class_cb","锡","class_cb14") + "</td><td>" + addCheckbox("class_cb","锌","class_cb15") + "</td><td>" + addCheckbox("class_cb","银","class_cb16") + "</td><td>" + addCheckbox("class_cb","萤石","class_cb17") + "</td><td>" + addCheckbox("class_cb","铀","class_cb18") + "</td><td>" + addCheckbox("class_cb","稀土氧化物","class_cb19") + "</td><td>" + addCheckbox("class_cb","重晶石","class_cb20") + "</td></tr>";
str += "<tr><td>" + addCheckbox("class_cb","硼","class_cb21") + "</td><td>" + addCheckbox("class_cb","磷","class_cb22") + "</td><td>" + addCheckbox("class_cb","水泥灰岩","class_cb23") + "</td><td>" + addCheckbox("class_cb","熔剂灰岩","class_cb24") + "</td><td>" + addCheckbox("class_cb","冶金白云岩","class_cb25") + "</td><td>" + addCheckbox("class_cb","岩盐","class_cb26") + "</td><td>" + addCheckbox("class_cb","芒硝","class_cb27") + "</td><td>" + addCheckbox("class_cb","钙芒硝","class_cb28") + "</td><td>" + addCheckbox("class_cb","地下水","class_cb29") + "</td><td>" + addCheckbox("class_cb","地下热水","class_cb30") + "</td></tr>";
str += "</table></div></div>";
showWindow("我的提示框",str,850,250,true,["地区",fun1,"矿种",fun2]);
}
function selectAll(obj,oName)
{
var checkboxs = document.getElementsByName(oName);
for(var i=0;i<checkboxs.length;i++)
{
checkboxs[i].checked = obj.checked;
}
}
function getStr(cbName)
{
var cbox = document.getElementsByName(cbName);
var str = "";
for (var i=0;i<cbox.length;i++)
{
if(cbox[i].checked)
{
str += "," + cbox[i].value;
}
}
str = str.substr(1);
return str;
}
function fun1()
{
var str = getStr("cities_cb");
alert("你选择的地区为:" + str);
}
function fun2()
{
var str = getStr("class_cb");
alert("你选择的矿种为:" + str);
}
</script>
</head>
<body>
<div class ="layout"></div>
<div class ="layout"></div>
<div class ="layout">
<input type="button" value="显示" onclick="show()" />
</div>
</body>
</html>

此脚本在ie,firefox浏览器下运行通过。。。。