欢迎来到福编程网,本站提供各种互联网专业知识!

用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










  • One

  • Two




另外,还需要设置该页面所使用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+"

";
//在info元素前插入一个元素
newInsertion.Before($('lbLoadMessage'),info)
//改变该元素的classname的值
$('lightbox').className="done";
//调用本类中actions方法
this.actions();
varctrl=$('lightbox');
//为高亮层添加事件处理方法reset
Event.observe(ctrl,'click',this.reset.bindAsEventListener(this),false);
ctrl.onclick=function(){returnfalse;};
},
//恢复初始状态
reset:function(){
//隐藏覆盖层
$('overlay').style.display="none";
//清空返回数据
$('lbContent').innerHTML="";
//隐藏高亮层
$('lightbox').style.display="none";
},
//Searchthroughnewlinkswithinthelightbox,andattachclickevent
actions:function(){
lbActions=document.getElementsByClassName('lbAction');
for(i=0;iEvent.observe(lbActions[i],'click',this[lbActions[i].rel].bindAsEventListener(this),false);
lbActions[i].onclick=function(){returnfalse;};
}

}
}

提示:由于该对象比较复杂,读者可以仔细参阅代码的注释部分。


服务器端代码

服务器端首先获得查询中的“id”值,如果该值为null或为空,则设置为默认值。然后判断该值,并且返回相应的一段字符串信息。处理请求的getInfojsp页面代码如下:
<%@pagelanguage="java"import="java.util.*"%>
<%
//获得请求中id的值
StringimgID=request.getParameter("id");
if(imgID==null||imgID.equals(""))//如果为null或为空
imgID="one";//设定为默认值
if(imgID.equals("one"))//如果为one
{
%>
PorscheCarreraGT

TheCarreraGThasa5.7litreV10internalcombustionenginethatproduces
605SAEhorsepower(451kW).Porscheclaimsitwillacceleratefrom0to100
km/h(62mph)in3.9secondsandhasamaximumspeedof330km/h(204mph).
With605hp,thecarweighs1,380kg(3,042lb).TheCarreraGTisonly
offeredwithasix-speedmanualtransmission,incontrasttoitsrivalthe
FerrariEnzothatisonlyofferedwithsequentialmanualtransmission.Also
theCarreraGTissignificantlylessexpensivethantheFerrariEnzo.The
FerrariEnzoispricedaround$660,000totheCarreraGT's$440,000.The
CarreraGTisknownforitshighqualityandreliabilitywhichmakesitoneof
thebestsupercarsever.
<%}else{//否则
%>
FerrariTestarossa

TheFerrariTestarossaisanV12mid-enginedsportscarmadebyFerrari.
Thename,whichmeans"redhead",comesfromtheredpaintedcylinderheadson
theflat-12engine.Theenginewastechnicallya180?Venginesinceitshared
flat-planecrankshaftpinswithopposingcylinders.Outputwas390hp(291
kW),andthecarwonmanycomparisontestsandadmirers-itwasfeaturedon
thecoverofRoad&Trackmagazineninetimesinjustfiveyears.Almost
10,000Testarossas,512TRs,and512Mswereproduced,makingthisoneofthe
mostcommonFerrarimodelsdespiteitshighpriceandexoticdesign.
<%}%>

相关推荐