JS实现弹出层锁定窗口(改进版)
2008-02-03 17:12
405 查看
关于NeatDialog这个窗口在网上应该是随处可见了,不知道是哪位高手写的,我这篇文章中提到的锁定窗口也是基于NeatDialog,不过稍微做了些改进,在此要感谢NeatDialog的作者。
在项目中用到了NeatDialog,是结合使用ajaxtag来使用,需求是这样的:
首先在preFunction中调用NeatDialog,盖住页面,是用户无法操作;
然后在postFunction中关闭NeatDialog,使用户可以继续操作;
当使用select联动时,如果是一级联动没什么问题,如果是二级联动就会出现NeatDialog窗口无法关闭的问题
再次看了看NeatDialog,发现每次显示NeatDialog都要new,然后新增Element,关闭是再删除Element;
由于ajaxtag在多级联动时,preFunction和postFunction被调用了多次,所以导致NeatDialog对象新增删除出现了问题
为了解决这个问题,我参照了Yahoo UI的设计思路,即在页面装载或者初始化时,把NeatDialog也装载或者初始化,但是先不显示,当调用show方法时再显示,调用close时将其隐藏(注意不是删除),这样就可以解决上面的问题了。
我觉得这样比原来这种方式更节省资源,毕竟每调用一次就new一个对象,系统开销还是很大的。
为了和之前的NeatDialog加以区别,将其改名为Loader,本来是想做等待窗口的,所以就叫Loader。
部分代码如下:
<SCRIPT type="text/javascript">
Loader = function(sHTML, sTitle, bCancel){
this.elt = null;
if (document.createElement && document.getElementById)
{
var dg = document.createElement("div");
dg.className = "neat-dialog";
sHTML = '<p id=sHTML >' + sHTML + '</p>';
//bCancel = !bCancel;
sHTML = '<div class="neat-dialog-title"><span id=sTitle>' + sTitle +
'</span><img id="nd-cancel" src="x.gif" alt="Cancel" class="nd-cancel" ' +
((bCancel)?'style="display:"':'style="display:none"') + '/>' +
'</div>/n' + sHTML;
sHTML += '<p><div align="center"><img src="rel_interstitial_loading.gif"/></div></p>';
dg.innerHTML = sHTML;
var dbg = document.createElement("div");
dbg.id = "nd-bdg";
dbg.className = "neat-dialog-bg";
var ifrm = '<iframe style="position:absolute;z-index:9;width:expression(this.nextSibling.offsetWidth);'
+ 'height:expression(this.nextSibling.offsetHeight);top:expression(this.nextSibling.offsetTop);'
+ 'left:expression(this.nextSibling.offsetLeft);" frameborder="0" ></iframe>';
var dgc = document.createElement("div");
dgc.id = "nd-dgc";
dgc.className = "neat-dialog-cont";
dgc.appendChild(dbg);
dgc.innerHTML += ifrm;
dgc.appendChild(dg);
//alert(dgc.outerHTML);
//adjust positioning if body has a margin
if (document.body.offsetLeft > 0)
dgc.style.marginLeft = document.body.offsetLeft + "px";
//document.body.innerHTML += ifrm;
document.body.appendChild(dgc);
//if (bCancel) document.getElementById("nd-cancel").onclick = function(){
// this.close();
//};
this.elt = dgc;
this.elt.style.display = "none";
//dgc.focus();
//document.body.style.overflow="visible";
}
};
Loader.prototype.show = function(sHTML, sTitle, bCancel) {
if (this.elt){
document.getElementById("sHTML").innerHTML = sHTML;
if (sTitle) {
document.getElementById("sTitle").innerHTML = sTitle;
} else {
document.getElementById("sTitle").innerHTML = ' ';
}
if(bCancel){
document.getElementById("nd-cancel").style.display = "";
document.getElementById("nd-cancel").onclick = bCancel;
} else {
document.getElementById("nd-cancel").style.display = "none";
}
this.elt.style.display = "";
this.elt.focus();
//this.elt.parentNode.removeChild(this.elt);
document.body.style.overflow="visible";
}
};
Loader.prototype.close = function() {
if (this.elt){
this.elt.style.display = "none";
//this.elt.parentNode.removeChild(this.elt);
document.body.style.overflow="";
}
};
具体例子请参照我论坛中附件内容。
原文地址:http://www.88fly.com.cn/bbs/viewthread.php?tid=38&extra=page%3D1或者http://fireflys.vicp.net/bbs/viewthread.php?tid=38&extra=page%3D1
在项目中用到了NeatDialog,是结合使用ajaxtag来使用,需求是这样的:
首先在preFunction中调用NeatDialog,盖住页面,是用户无法操作;
然后在postFunction中关闭NeatDialog,使用户可以继续操作;
当使用select联动时,如果是一级联动没什么问题,如果是二级联动就会出现NeatDialog窗口无法关闭的问题
再次看了看NeatDialog,发现每次显示NeatDialog都要new,然后新增Element,关闭是再删除Element;
由于ajaxtag在多级联动时,preFunction和postFunction被调用了多次,所以导致NeatDialog对象新增删除出现了问题
为了解决这个问题,我参照了Yahoo UI的设计思路,即在页面装载或者初始化时,把NeatDialog也装载或者初始化,但是先不显示,当调用show方法时再显示,调用close时将其隐藏(注意不是删除),这样就可以解决上面的问题了。
我觉得这样比原来这种方式更节省资源,毕竟每调用一次就new一个对象,系统开销还是很大的。
为了和之前的NeatDialog加以区别,将其改名为Loader,本来是想做等待窗口的,所以就叫Loader。
部分代码如下:
<SCRIPT type="text/javascript">
Loader = function(sHTML, sTitle, bCancel){
this.elt = null;
if (document.createElement && document.getElementById)
{
var dg = document.createElement("div");
dg.className = "neat-dialog";
sHTML = '<p id=sHTML >' + sHTML + '</p>';
//bCancel = !bCancel;
sHTML = '<div class="neat-dialog-title"><span id=sTitle>' + sTitle +
'</span><img id="nd-cancel" src="x.gif" alt="Cancel" class="nd-cancel" ' +
((bCancel)?'style="display:"':'style="display:none"') + '/>' +
'</div>/n' + sHTML;
sHTML += '<p><div align="center"><img src="rel_interstitial_loading.gif"/></div></p>';
dg.innerHTML = sHTML;
var dbg = document.createElement("div");
dbg.id = "nd-bdg";
dbg.className = "neat-dialog-bg";
var ifrm = '<iframe style="position:absolute;z-index:9;width:expression(this.nextSibling.offsetWidth);'
+ 'height:expression(this.nextSibling.offsetHeight);top:expression(this.nextSibling.offsetTop);'
+ 'left:expression(this.nextSibling.offsetLeft);" frameborder="0" ></iframe>';
var dgc = document.createElement("div");
dgc.id = "nd-dgc";
dgc.className = "neat-dialog-cont";
dgc.appendChild(dbg);
dgc.innerHTML += ifrm;
dgc.appendChild(dg);
//alert(dgc.outerHTML);
//adjust positioning if body has a margin
if (document.body.offsetLeft > 0)
dgc.style.marginLeft = document.body.offsetLeft + "px";
//document.body.innerHTML += ifrm;
document.body.appendChild(dgc);
//if (bCancel) document.getElementById("nd-cancel").onclick = function(){
// this.close();
//};
this.elt = dgc;
this.elt.style.display = "none";
//dgc.focus();
//document.body.style.overflow="visible";
}
};
Loader.prototype.show = function(sHTML, sTitle, bCancel) {
if (this.elt){
document.getElementById("sHTML").innerHTML = sHTML;
if (sTitle) {
document.getElementById("sTitle").innerHTML = sTitle;
} else {
document.getElementById("sTitle").innerHTML = ' ';
}
if(bCancel){
document.getElementById("nd-cancel").style.display = "";
document.getElementById("nd-cancel").onclick = bCancel;
} else {
document.getElementById("nd-cancel").style.display = "none";
}
this.elt.style.display = "";
this.elt.focus();
//this.elt.parentNode.removeChild(this.elt);
document.body.style.overflow="visible";
}
};
Loader.prototype.close = function() {
if (this.elt){
this.elt.style.display = "none";
//this.elt.parentNode.removeChild(this.elt);
document.body.style.overflow="";
}
};
具体例子请参照我论坛中附件内容。
原文地址:http://www.88fly.com.cn/bbs/viewthread.php?tid=38&extra=page%3D1或者http://fireflys.vicp.net/bbs/viewthread.php?tid=38&extra=page%3D1
相关文章推荐
- JS实现弹出层锁定窗口(改进版)
- js实现弹出窗口代码集萃 (怕忘记找别人的)
- C#+JS简单实现 定时轮询数据表 以及时弹出消息提示窗口
- HTML+js+css实现点击图片弹出上传文件窗口的两种思路
- 利用js实现遮罩以及弹出可移动登录窗口
- js实现浏览器右下角弹出提示信息窗口,几秒后自动关闭
- JS实现制作弹出小窗口并获取参数值1(用JS制作9种弹出小窗口(HTML))
- .NET, MVC框架下利用html, CSS,js实现弹出窗口
- JS关闭窗口弹出新窗口,关闭新窗口时,刷新父窗口,JS代码实现刷新网页,js实现弹出窗口代码收集集萃
- 利用js实现遮罩以及弹出可移动登录窗口
- 让js弹出窗口居前显示的实现方法
- 用AS+JS实现IE等浏览器的强制弹出窗口源代码
- js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
- js实现弹出窗口、页面变成灰色并不可操作的例子分享
- JS实现点击登录弹出窗口同时背景色渐变动画效果
- 用js实现弹出窗口《iframe》
- JS实现制作弹出小窗口并获取参数值2(js弹出对话框集合)
- .NET, MVC框架下利用html, CSS,js实现弹出窗口
- js实现弹出窗口代码收集集萃
- js实现点击按钮弹出上传文件的窗口