用JavaScript实现仿Windows关机效果
发布时间:2007-03-10 作者: 来源:转载
基本原理分析Windows关机效果分析使用Windows系统的用户在关机的时候,出现的界面只允许用户选择关机、注销或取消动作,而桌面上的程序都不能使用,并且屏幕呈现灰色状态。本例将仿照这种高亮显示的效果在网页上实现.在网页上运用这种关机效果有什么好处呢?
基本原理分析
Windows关机效果分析
使用Windows系统的用户在关机的时候,出现的界面只允许用户选择关机、注销或取消动作,而桌面上的程序都不能使用,并且屏幕呈现灰色状态。
本例将仿照这种高亮显示的效果在网页上实现.
在网页上运用这种关机效果有什么好处呢?首先,由于单击某一链接后,将用户此时不可用的操作隐藏在后台,将可用的操作放在屏幕最上层,并高亮显示,可以避免用户的误操作。其次,将信息高亮显示,也可以提醒用户应该注意的事项。
网页中实现关机效果分析
在网页中实现这种效果的原理很简单。创建两个图层,一个为遮盖层,覆盖整个页面,并且显示为灰色;另一个图层作为高亮显示的部分,在遮盖层的上方,这可通过设置图层的z-index属性来设置。当取消关机效果后,只需将这两个图层元素在页面中删除即可。
以下代码实现显示关机效果。
AJAXLightBoxSample
#lightbox{/*该层为高亮显示层*/
BORDER-RIGHT:#fff1pxsolid;
BORDER-TOP:#fff1pxsolid;
DISPLAY:block;
Z-INDEX:9999;/*设置该层在网页的最上端,设置足够大*/
BACKGROUND:#fdfce9;/*设置背景色*/
LEFT:50%;
MARGIN:-220px0px0px-250px;
BORDER-LEFT:#fff1pxsolid;
WIDTH:500px;
BORDER-BOTTOM:#fff1pxsolid;
POSITION:absolute;
TOP:50%;
HEIGHT:400px;
TEXT-ALIGN:left
}
#overlay{/*该层为覆盖层*/
DISPLAY:block;
Z-INDEX:9998;/*设置高亮层的下方*/
FILTER:alpha(opacity=80);/*设置成透明*/
LEFT:0px;
WIDTH:100%;
POSITION:absolute;
TOP:0px;
HEIGHT:100%;
BACKGROUND-COLOR:#000;
moz-opacity:0.8;
opacity:.80
}
需要注意的是,在IE浏览器中如果有<select>标记,则该标记不能被覆盖层覆盖,但在其他浏览器中则可以覆盖。
在使用IE浏览器时,要先将网页中的<select>元素隐藏起来。如以下代码可以用于隐藏页面所有的<select>元素。
selects=document.getElementsByTagName('select');
for(i=0;i<selects.length;i++){
selects[i].style.visibility=visibility;
}
代码实现
客户端代码
客户端的页面上有两个链接,用户单击链接后,向服务器端发送请求,并将返回信息显示到高亮层上。客户端的网页文件代码如下所示:
AJAXLightBox
另外,还需要设置该页面所使用CSS样式。lightbox.css样式表文件代码如下所示:
#lightbox{
BORDER-RIGHT:#fff1pxsolid;
BORDER-TOP:#fff1pxsolid;
DISPLAY:none;
Z-INDEX:9999;
BACKGROUND:#fdfce9;
LEFT:50%;
MARGIN:-220px0px0px-250px;
BORDER-LEFT:#fff1pxsolid;
WIDTH:500px;
BORDER-BOTTOM:#fff1pxsolid;
POSITION:absolute;
TOP:50%;
HEIGHT:400px;
TEXT-ALIGN:left
}
UNKNOWN{
POSITION:fixed
}
#overlay{
DISPLAY:none;
Z-INDEX:5000;FILTER:alpha(opacity=80);
LEFT:0px;
WIDTH:100%;
POSITION:absolute;
TOP:0px;
HEIGHT:100%;
BACKGROUND-COLOR:#000;moz-opacity:0.8;opacity:.80
}
UNKNOWN{
POSITION:fixed
}
.done#lightbox#lbLoadMessage{
DISPLAY:none
}
.done#lightbox#lbContent{
DISPLAY:block
}
.loading#lightbox#lbContent{
DISPLAY:none
}
.loading#lightbox#lbLoadMessage{
DISPLAY:block
}
.done#lightboxIMG{
WIDTH:100%;HEIGHT:100%
}
客户端脚本
由于浏览器对图层的支持不同,所以首先要确定客户端浏览器的类型。以下代码可用于判断客户端的浏览器和操作系统。
vardetect=navigator.userAgent.toLowerCase();
varOS,browser,version,total,thestring;
functiongetBrowserInfo(){
if(checkIt('konqueror')){
browser="Konqueror";
OS="Linux";
}
elseif(checkIt('safari'))browser="Safari"
elseif(checkIt('omniWeb'))browser="OmniWeb"
elseif(checkIt('opera'))browser="Opera"
elseif(checkIt('Webtv'))browser="WebTV";
elseif(checkIt('icab'))browser="iCab"
elseif(checkIt('msie'))browser="InternetExplorer"
elseif(!checkIt('compatible')){
browser="NetscapeNavigator"
version=detect.charAt(8);
}
elsebrowser="Anunknownbrowser";
if(!version)version=detect.charAt(place+thestring.length);
if(!OS){
if(checkIt('linux'))OS="Linux";
elseif(checkIt('x11'))OS="Unix";
elseif(checkIt('mac'))OS="Mac"
elseif(checkIt('win'))OS="Windows"
elseOS="anunknownoperatingsystem";
}
}
functioncheckIt(string){
place=detect.indexOf(string)+1;
thestring=string;
returnplace;
}
下面看一下网页加载时需要添加的方法。有关网页加载和初始化方法代码如下:
//网页加载调用initialize和getBrowserInfo方法
Event.observe(window,'load',initialize,false);
Event.observe(window,'load',getBrowserInfo,false);
//未加载时清空缓存
Event.observe(window,'unload',Event.unloadCache,false);
//初始化方法
functioninitialize(){
//调用该方法为该页添加覆盖层和高亮显示层
addLightboxMarkup();
//为每个可高亮显示的元素创建lightbox对象
lbox=document.getElementsByClassName('lbOn');
for(i=0;ivalid=newlightbox(lbox[i]);
}
}
//使用Dom方法创建覆盖层和高亮层
functionaddLightboxMarkup(){
bod=document.getElementsByTagName('body')[0];
overlay=document.createElement('div');
overlay.id='overlay';
lb=document.createElement('div');
lb.id='lightbox';
lb.className='loading';
lb.innerHTML=''+
'Loading
'+
'
';
bod.appendChild(overlay);
bod.appendChild(lb);
}
封装lightbox类
初始化数据时,为每个可高亮显示的链接创建了lightbox对象。该类的代码具体实现如下:
varlightbox=Class.create();
lightbox.prototype={
yPos:0,
xPos:0,
//构造方法,ctrl为创建该对象的元素
initialize:function(ctrl){
//将该元素的链接赋值给this.content
this.content=ctrl.href;
//为该元素添加onclick事件activate方法
Event.observe(ctrl,'click',this.activate.bindAsEventListener(this),false);
ctrl.onclick=function(){returnfalse;};
},
//当单击链接时
activate:function(){
if(browser=='InternetExplorer'){//判断为IE浏览器
this.getScroll();
this.prepareIE('100%','hidden');
this.setScroll(0,0);
this.hideSelects('hidden');//隐藏所有的<select>标记
}
//调用该类中的displayLightbox方法
this.displayLightbox("block");
},
prepareIE:function(height,overflow){
bod=document.getElementsByTagName('body')[0];
bod.style.height=height;
bod.style.overflow=overflow;
htm=document.getElementsByTagName('html')[0];
htm.style.height=height;
htm.style.overflow=overflow;
},
hideSelects:function(visibility){
selects=document.getElementsByTagName('select');
for(i=0;i<selects.length;i++){
selects[i].style.visibility=visibility;
}
},
getScroll:function(){
if(self.pageYOffset){
this.yPos=self.pageYOffset;
}elseif(document.documentElement&&document.documentElement.scrollTop){
this.yPos=document.documentElement.scrollTop;
}elseif(document.body){
this.yPos=document.body.scrollTop;
}
},
setScroll:function(x,y){
window.scrollTo(x,y);
},
displayLightbox:function(display){
//将覆盖层显示
$('overlay').style.display=display;
//将高亮层显示
$('lightbox').style.display=display;
//如果不是隐藏状态,则调用该类中的loadInfo方法
if(display!='none')this.loadInfo();
},
//该方法发送Ajax请求
loadInfo:function(){
//当请求完成后调用本类中processInfo方法
varmyAjax=newAjax.Request(
this.content,
{method:'get',parameters:"",onComplete:this.processInfo.bindAsEventListener(this)}
);
},
//将返回的文本信息显示到高亮层上
processInfo:function(response){
//获得返回的文本数据
varresult=response.responseText;
//显示到高亮层
info=""+result+"
";