zoukankan      html  css  js  c++  java
  • 百度空间的popup效果分析

        自从用firefox浏览器以来,就几乎养成了一个习惯,就想用WebDeveloper把一些漂亮网站的js包括css给down下来分析一下,用来学习。百度空间的弹出窗口和拖拽效果,看起来挺不错的。现在很多知名网站都是用的这样的技术。下面把我down的js代码发出来,我分析了一部分,但是还有很多东西不明白怎么回事,没有写注释的部分,还请高手能帮我解释一下。本人属于初学,有不对的地方还请多多指教。
        在声明一条吧,此代码仅做学习用,技术版权属于百度。
        主要是一个叫做:popup.js的文件,如下:
      1/*********************************************** popup.js**************************************************/
      2
      3
      4//为数组Array添加一个push方法
      5//为数组的末尾加入一个对象
      6if(!Array.prototype.push)
      7{
      8    Array.prototype.push=function ()
      9    {
     10        var startLength=this.length;
     11        for(var i=0;i<arguments.length;i++)
     12        {
     13            this[startLength+i]=arguments[i];
     14        }

     15        return this.length;
     16     }

     17 }
    ;
     18
     19//对G函数的参数进行处理
     20function G()
     21{
     22    //定义一个数组用来保存参数
     23    var elements=new Array();
     24    //循环分析G中参数的内容
     25    for(var i=0;i<arguments.length;i++)
     26    {
     27        var element=arguments[i];
     28        
     29        //如果参数的类型为string,则获得以这个参数为ID的对象
     30        if(typeof element=='string')
     31        {
     32            element=document.getElementById(element);
     33        }

     34        //如果参数的长度为1
     35        if(arguments.length==1)
     36        {
     37            return element;
     38        }

     39        //将对象加入到数组的末尾
     40        elements.push(element);
     41    }
    ;
     42    return elements;
     43}
    ;
     44
     45Function.prototype.bind=function (object)
     46{
     47    var __method=this;
     48    return function ()
     49    {
     50        __method.apply(object,arguments);
     51    }
    ;
     52}
    ;
     53
     54//绑定事件
     55Function.prototype.bindAsEventListener=function (object)
     56{
     57    var __method=this;
     58    return function (event){__method.call(object,event||window.event);};
     59}
    ;
     60
     61
     62Object.extend=function (destination,source)
     63{
     64    for(property in source)
     65    {
     66        destination[property]=source[property];
     67    }
    ;
     68    return destination;
     69}
    ;
     70
     71
     72if(!window.Event)
     73{
     74    var Event=new Object();
     75}
    ;
     76
     77Object.extend(
     78    Event,
     79    
     80    {
     81        observers:false,
     82        element:function (event)
     83        {
     84            return event.target||event.srcElement;
     85        }
    ,
     86        
     87        isLeftClick:function (event)
     88        {
     89            return (((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));
     90        }
    ,
     91        
     92        pointerX:function (event)
     93        {
     94            return event.pageX||(event.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft));
     95        }
    ,
     96        
     97        pointerY:function (event)
     98        {
     99            return event.pageY||(event.clientY+(document.documentElement.scrollTop||document.body.scrollTop));
    100        }
    ,
    101        
    102        stop:function (event)
    103        {
    104            if(event.preventDefault)
    105            {
    106                event.preventDefault();
    107                event.stopPropagation();
    108            }

    109            else 
    110            {
    111                event.returnValue=false;
    112                event.cancelBubble=true;
    113            }
    ;
    114        }
    ,
    115        
    116        findElement:function (event,tagName)
    117        {
    118            var element=Event.element(event);
    119            while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase())))
    120                element=element.parentNode;
    121            return element;
    122        }
    ,
    123        
    124        _observeAndCache:function (element,name,observer,useCapture)
    125        {
    126            if(!this.observers)
    127                this.observers=[];
    128            if(element.addEventListener)
    129            {
    130                this.observers.push([element,name,observer,useCapture]);
    131                element.addEventListener(name,observer,useCapture);
    132            }

    133            else if(element.attachEvent)
    134            {
    135                this.observers.push([element,name,observer,useCapture]);
    136                element.attachEvent('on'+name,observer);
    137            }
    ;
    138        }
    ,
    139        
    140        unloadCache:function ()
    141        {
    142            if(!Event.observers)
    143                return;
    144            for(var i=0;i<Event.observers.length;i++)
    145            {
    146                Event.stopObserving.apply(this,Event.observers[i]);
    147                Event.observers[i][0]=null;
    148            }
    ;
    149            Event.observers=false;
    150        }
    ,
    151        
    152        observe:function (element,name,observer,useCapture)
    153        {
    154            var element=G(element);
    155            useCapture=useCapture||false;
    156            if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))
    157                name='keydown';
    158            this._observeAndCache(element,name,observer,useCapture);
    159        }
    ,
    160        
    161        stopObserving:function (element,name,observer,useCapture)
    162        {
    163            var element=G(element);
    164            useCapture=useCapture||false;
    165            if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent))
    166                name='keydown';
    167            if(element.removeEventListener)
    168            {
    169                element.removeEventListener(name,observer,useCapture);
    170            }

    171            else if(element.detachEvent)
    172            {
    173                element.detachEvent('on'+name,observer);
    174            }
    ;
    175        }

    176    }

    177);
    178
    179Event.observe(window,'unload',Event.unloadCache,false);
    180
    181
    182
    183var Class=function ()
    184{
    185    var _class=function ()
    186    {
    187        this.initialize.apply(this,arguments);
    188    }
    ;
    189    for(i=0;i<arguments.length;i++)
    190    {
    191        superClass=arguments[i];
    192        for(member in superClass.prototype)
    193        {
    194            _class.prototype[member]=superClass.prototype[member];
    195        }
    ;
    196    }
    ;
    197    _class.child=function ()
    198    {
    199        return new Class(this);
    200    }
    ;
    201    _class.extend=function (f)
    202    {
    203        for(property in f)
    204        {
    205            _class.prototype[property]=f[property];
    206        }
    ;
    207    }
    ;
    208    return _class;
    209}
    ;
    210
    211
    212//改变百度空间的最顶端和最低端的div的id值
    213//如果flag为begin,则为弹出状态的id值
    214//如果flag为end,则为非弹出状态的id值,即原本的id值
    215function space(flag)
    216{
    217    if(flag=="begin")
    218    {
    219        var ele=document.getElementById("ft");
    220        if(typeof(ele)!="#ff0000"&&ele!=null)
    221            ele.id="ft_popup";
    222        ele=document.getElementById("usrbar");
    223        if(typeof(ele)!="undefined"&&ele!=null)
    224            ele.id="usrbar_popup";
    225     }

    226     else if(flag=="end")
    227     {
    228        var ele=document.getElementById("ft_popup");
    229        if(typeof(ele)!="undefined"&&ele!=null)
    230            ele.id="ft";
    231        ele=document.getElementById("usrbar_popup");
    232        if(typeof(ele)!="undefined"&&ele!=null)
    233            ele.id="usrbar";
    234     }
    ;
    235 }
    ;
    236
    237
    238
    239//**************************************************Popup类弹出窗口***************************************************************
    240
    241
    242var Popup=new Class();
    243
    244Popup.prototype=
    245        //弹出窗口中框架的name名称
    246        iframeIdName:'ifr_popup',
    247    
    248        initialize:function (config)
    249        {
    250            //---------------弹出对话框的配置信息------------------
    251            //contentType:设置内容区域为什么类型:1为另外一个html文件 | 2为自定义html字符串 | 3为confirm对话框 | 4为alert警告对话框
    252            //isHaveTitle:是否显示标题栏
    253            //scrollType:设置或获取对话框中的框架是否可被滚动
    254            //isBackgroundCanClick:弹出对话框后,是否允许蒙布后的所有元素被点击。也就是如果为false的话,就会有全屏蒙布,如果为true的话,就会去掉全屏蒙布
    255            //isSupportDraging:是否支持拖拽
    256            //isShowShadow:是否现实阴影
    257            //isReloadOnClose:是否刷新页面,并关闭对话框
    258            //width:宽度
    259            //height:高度
    260            this.config=Object.extend({contentType:1,isHaveTitle:true,scrollType:'yes',isBackgroundCanClick:false,isSupportDraging:true,isShowShadow:true,isReloadOnClose:true,400,height:300},config||{});
    261            
    262            //----------------对话框的参数值信息------------------------
    263            //shadowWidth  :阴影的宽度
    264            //contentUrl   :html链接页面
    265            //contentHtml  :html内容
    266            //callBack     :回调的函数名
    267            //parameter    :回调的函数名中传的参数
    268            //confirmCon   :对话框内容
    269            //alertCon     :警告框内容
    270            //someHiddenTag:页面中需要隐藏的元素列表,以逗号分割
    271            //someHiddenEle:需要隐藏的元素的ID列表(和someToHidden的区别是:someHiddenEle是通过getElementById,而someToHidden是通过getElementByTagName,里面放的是对象)
    272            //overlay      :
    273            //coverOpacity :蒙布的透明值
    274            this.info={shadowWidth:4,title:"",contentUrl:"",contentHtml:"",callBack:null,parameter:null,confirmCon:"",alertCon:"",someHiddenTag:"select,object,embed",someHiddenEle:"",overlay:0,coverOpacity:40};
    275            
    276            //设置颜色cColor:蒙布的背景, bColor:内容区域的背景, tColor:标题栏和边框的颜色,wColor:字体的背景色
    277            this.color={cColor:"#EEEEEE",bColor:"#FFFFFF",tColor:"#709CD2",wColor:"#FFFFFF"};
    278            
    279            this.dropClass=null;
    280            
    281            //用来放置隐藏了的对象列表,在hiddenTag方法中第一次调用
    282            this.someToHidden=[];
    283            
    284            //如果没有标题栏则不支持拖拽
    285            if(!this.config.isHaveTitle)
    286            {
    287                this.config.isSupportDraging=false;
    288            }

    289            //初始化
    290            this.iniBuild();
    291        }
    ,
    292        
    293        //设置配置信息和参数内容
    294        setContent:function (arrt,val)
    295        {
    296            if(val!='')
    297            {
    298                switch(arrt)
    299                {
    300                    case 'width':this.config.width=val;
    301                    break;
    302                    case 'height':this.config.height=val;
    303                    break;
    304                    case 'title':this.info.title=val;
    305                    break;
    306                    case 'contentUrl':this.info.contentUrl=val;
    307                    break;
    308                    case 'contentHtml':this.info.contentHtml=val;
    309                    break;
    310                    case 'callBack':this.info.callBack=val;
    311                    break;
    312                    case 'parameter':this.info.parameter=val;
    313                    break;
    314                    case 'confirmCon':this.info.confirmCon=val;
    315                    break;
    316                    case 'alertCon':this.info.alertCon=val;
    317                    break;
    318                    case 'someHiddenTag':this.info.someHiddenTag=val;
    319                    break;
    320                    case 'someHiddenEle':this.info.someHiddenEle=val;
    321                    break;
    322                    case 'overlay':this.info.overlay=val;
    323                }
    ;
    324            }
    ;
    325        }
    ,
    326        
    327        iniBuild:function ()
    328        {
    329            G('dialogCase')?G('dialogCase').parentNode.removeChild(G('dialogCase')):function (){};
    330            var oDiv=document.createElement('span');
    331            oDiv.id='dialogCase';
    332            document.body.appendChild(oDiv);
    333        }
    ,
    334        
    335        build:function ()
    336        
    337            //设置全屏蒙布的z-index
    338            var baseZIndex=10001+this.info.overlay*10;
    339            //设置蒙布上的弹出窗口的z-index(比蒙布的z-index高2个值)
    340            var showZIndex=baseZIndex+2;
    341            
    342            //定义框架名称
    343            this.iframeIdName='ifr_popup'+this.info.overlay;
    344            
    345            //设置图片的主路径
    346            var path="http://img.baidu.com/hi/img/";
    347            
    348            //关闭按钮
    349            var close='<input type="image" id="dialogBoxClose" src="'+path+'dialogclose.gif" border="0" width="16" height="16" align="absmiddle" title="关闭"/>';
    350            
    351            //使用滤镜设置对象的透明度
    352            var cB='filter: alpha(opacity='+this.info.coverOpacity+');opacity:'+this.info.coverOpacity/100+';';
    353            
    354            //设置全屏的蒙布
    355            var cover='<div id="dialogBoxBG" style="position:absolute;top:0px;left:0px;100%;height:100%;z-index:'+baseZIndex+';'+cB+'background-color:'+this.color.cColor+';display:none;"></div>';
    356            
    357            //设置弹出的主窗口设置
    358            var mainBox='<div id="dialogBox" style="border:1px solid '+this.color.tColor+';display:none;z-index:'+showZIndex+';position:relative;'+this.config.width+'px;"><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="'+this.color.bColor+'">';
    359            
    360            //设置窗口标题栏
    361            if(this.config.isHaveTitle)
    362            {
    363                mainBox+='<tr height="24" bgcolor="'+this.color.tColor+'"><td><table style="-moz-user-select:none;height:24px;" width="100%" border="0" cellpadding="0" cellspacing="0" ><tr>'+'<td width="6" height="24"></td><td id="dialogBoxTitle" style="color:'+this.color.wColor+';font-size:14px;font-weight:bold;">'+this.info.title+'&nbsp;</td>'+'<td id="dialogClose" width="20" align="right" valign="middle">'+close+'</td><td width="6"></td></tr></table></td></tr>';
    364            }

    365            else 
    366            {
    367                mainBox+='<tr height="10"><td align="right">'+close+'</td></tr>';
    368            }
    ;
    369            
    370            //设置窗口主内容区域
    371            mainBox+='<tr style="height:'+this.config.height+'px" valign="top"><td id="dialogBody" style="position:relative;"></td></tr></table></div>'+'<div id="dialogBoxShadow" style="display:none;z-index:'+baseZIndex+';"></div>';
    372            
    373            //如果有蒙布
    374            if(!this.config.isBackgroundCanClick)
    375            {
    376                G('dialogCase').innerHTML=cover+mainBox;
    377                G('dialogBoxBG').style.height=document.body.scrollHeight;
    378            }

    379            else
    380            {
    381                G('dialogCase').innerHTML=mainBox;
    382            }

    383            
    384            Event.observe(G('dialogBoxClose'),"click",this.reset.bindAsEventListener(this),false);
    385            
    386            //如果支持拖动,则设置拖动处理
    387            if(this.config.isSupportDraging)
    388            {
    389                dropClass=new Dragdrop(this.config.width,this.config.height,this.info.shadowWidth,this.config.isSupportDraging,this.config.contentType);
    390                G("dialogBoxTitle").style.cursor="move";
    391            }
    ;
    392
    393            this.lastBuild();
    394        }
    ,
    395        
    396        
    397        lastBuild:function ()
    398        {
    399            //设置confim对话框的具体内容
    400            var confirm='<div style="100%;height:100%;text-align:center;"><div style="margin:20px 20px 0 20px;font-size:14px;line-height:16px;color:#000000;">'+this.info.confirmCon+'</div><div style="margin:20px;"><input id="dialogOk" type="button" value=" 确定 "/>&nbsp;<input id="dialogCancel" type="button" value=" 取消 "/></div></div>';
    401            //设置alert对话框的具体内容
    402            var alert='<div style="100%;height:100%;text-align:center;"><div style="margin:20px 20px 0 20px;font-size:14px;line-height:16px;color:#000000;">'+this.info.alertCon+'</div><div style="margin:20px;"><input id="dialogYES" type="button" value=" 确定 "/></div></div>';
    403            
    404            var baseZIndex=10001+this.info.overlay*10;
    405            var coverIfZIndex=baseZIndex+4;
    406            
    407            //判断内容类型决定窗口的主内容区域应该显示什么
    408            if(this.config.contentType==1)
    409            {
    410                var openIframe="<iframe width='100%' style='height:"+this.config.height+"px' name='"+this.iframeIdName+"' id='"+this.iframeIdName+"' src='"+this.info.contentUrl+"' frameborder='0' scrolling='"+this.config.scrollType+"'></iframe>";
    411                var coverIframe="<div id='iframeBG' style='position:absolute;top:0px;left:0px;1px;height:1px;z-index:"+coverIfZIndex+";filter: alpha(opacity=00);opacity:0.00;background-color:#ffffff;'><div>";
    412                G("dialogBody").innerHTML=openIframe+coverIframe;
    413            }

    414            else if(this.config.contentType==2)
    415            {
    416                G("dialogBody").innerHTML=this.info.contentHtml;
    417            }

    418            else if(this.config.contentType==3)
    419            {
    420                G("dialogBody").innerHTML=confirm;Event.observe(G('dialogOk'),"click",this.forCallback.bindAsEventListener(this),false);
    421                Event.observe(G('dialogCancel'),"click",this.close.bindAsEventListener(this),false);
    422            }

    423            else if(this.config.contentType==4)
    424            {
    425                G("dialogBody").innerHTML=alert;
    426                Event.observe(G('dialogYES'),"click",this.close.bindAsEventListener(this),false);
    427            }
    ;
    428        }
    ,
    429        
    430        //重新加载弹出窗口的高度和内容
    431        reBuild:function ()
    432        {
    433            G('dialogBody').height=G('dialogBody').clientHeight;
    434            this.lastBuild();
    435        }
    ,
    436        
    437        show:function ()
    438        {
    439            //隐藏一些在info中制定的元素
    440            this.hiddenSome();
    441            //弹出窗口居中
    442            this.middle();
    443            //设置阴影
    444            if(this.config.isShowShadow)
    445                this.shadow();
    446        }
    ,
    447        
    448        //设置回调函数
    449        forCallback:function ()
    450        {
    451            return this.info.callBack(this.info.parameter);
    452        }
    ,
    453        
    454        //为弹出窗口设置阴影
    455        shadow:function ()
    456        {
    457            var oShadow=G('dialogBoxShadow');
    458            var oDialog=G('dialogBox');oShadow['style']['position']="absolute";
    459            oShadow['style']['background']="#000";
    460            oShadow['style']['display']="";
    461            oShadow['style']['opacity']="0.2";
    462            oShadow['style']['filter']="alpha(opacity=20)";
    463            oShadow['style']['top']=oDialog.offsetTop+this.info.shadowWidth;
    464            oShadow['style']['left']=oDialog.offsetLeft+this.info.shadowWidth;
    465            oShadow['style']['width']=oDialog.offsetWidth;oShadow['style']['height']=oDialog.offsetHeight;
    466        }
    ,
    467        
    468        //让弹出窗口居中显示
    469        middle:function ()
    470        {
    471            if(!this.config.isBackgroundCanClick)
    472                G('dialogBoxBG').style.display='';
    473            var oDialog=G('dialogBox');
    474            oDialog['style']['position']="absolute";
    475            oDialog['style']['display']='';
    476            var sClientWidth=document.body.clientWidth;
    477            var sClientHeight=document.body.clientHeight;
    478            var sScrollTop=document.body.scrollTop;
    479            //alert("document.body.clientWidth = " + sClientWidth + "\ndocument.body.clientHeight" +sClientHeight);
    480            var sleft=(document.body.clientWidth/2)-(oDialog.offsetWidth/2);
    481            var iTop=-80+(sClientHeight/2+sScrollTop)-(oDialog.offsetHeight/2);
    482            var sTop=iTop>0?iTop:(sClientHeight/2+sScrollTop)-(oDialog.offsetHeight/2);
    483            //alert("var iTop=-80+(sClientHeight/2+sScrollTop)-(oDialog.offsetHeight/2);\n" + "sClientHeight is " + sClientHeight + "\nsScrollTop is " + sScrollTop);
    484            //alert("iTop is " + iTop);
    485            if(sTop<1)
    486                sTop="20";
    487            if(sleft<1)
    488                sleft="20";
    489            oDialog['style']['left']=sleft;
    490            oDialog['style']['top']=sTop;
    491            //alert("sleft is " + sleft);
    492            //alert("sTop is " + sTop);
    493        }
    ,
    494        
    495        //刷新页面,并关闭当前弹出窗口
    496        reset:function ()
    497        {
    498            if(this.config.isReloadOnClose)
    499            {
    500                top.location.reload();
    501            }
    ;
    502            this.close();
    503        }
    ,
    504        
    505        //关闭当前弹出窗口
    506        close:function ()
    507        {
    508            G('dialogBox').style.display='none';
    509            if(!this.config.isBackgroundCanClick)
    510                G('dialogBoxBG').style.display='none';
    511            if(this.config.isShowShadow)
    512                G('dialogBoxShadow').style.display='none';
    513            G('dialogBody').innerHTML='';
    514            
    515            this.showSome();
    516        }
    ,
    517        
    518        //隐藏someHiddenTag和someHiddenEle中的所有元素
    519        hiddenSome:function ()
    520        {
    521            //隐藏someHiddenTag中的所有元素
    522            var tag=this.info.someHiddenTag.split(",");
    523            if(tag.length==1&&tag[0]=="")
    524            {
    525                tag.length=0;
    526            }

    527            for(var i=0;i<tag.length;i++)
    528            {
    529                this.hiddenTag(tag[i]);
    530            }
    ;
    531            //隐藏someHiddenEle中的所有逗号分割的ID的元素
    532            var ids=this.info.someHiddenEle.split(",");
    533            if(ids.length==1&&ids[0]=="")
    534                ids.length=0;
    535            for(var i=0;i<ids.length;i++)
    536            {
    537                this.hiddenEle(ids[i]);
    538            }
    ;
    539            //改变顶部和底部的div的id值为弹出状态的id值,祥见space的实现
    540            space("begin");
    541        }
    ,
    542        
    543        //隐藏一组元素
    544        hiddenTag:function (tagName)
    545        {
    546            var ele=document.getElementsByTagName(tagName);
    547            if(ele!=null)
    548            {
    549                for(var i=0;i<ele.length;i++)
    550                {
    551                    if(ele[i].style.display!="none"&&ele[i].style.visibility!='hidden')
    552                    {
    553                        ele[i].style.visibility='hidden';
    554                        this.someToHidden.push(ele[i]);
    555                    }
    ;
    556                }
    ;
    557             }
    ;
    558         }
    ,
    559         
    560         //隐藏单个元素
    561         hiddenEle:function (id)
    562         {
    563            var ele=document.getElementById(id);
    564            if(typeof(ele)!="undefined"&&ele!=null)
    565            {
    566                ele.style.visibility='hidden';
    567                this.someToHidden.push(ele);
    568            }

    569         }
    ,
    570         
    571         //将someToHidden中保存的隐藏元素全部显示
    572         //并恢复顶部和底部的div为原来的id值
    573         showSome:function ()
    574         {
    575            for(var i=0;i<this.someToHidden.length;i++)
    576            {
    577                this.someToHidden[i].style.visibility='visible';
    578            }
    ;
    579            space("end");
    580         }

    581     }
    ;
    582
    583
    584
    585
    586//********************************************************Dragdrop类(拖拽动作)************************************************************
    587
    588var Dragdrop=new Class();
    589
    590Dragdrop.prototype={
    591        initialize:function (width,height,shadowWidth,showShadow,contentType)
    592        {
    593            this.dragData=null;
    594            this.dragDataIn=null;
    595            this.backData=null;
    596            this.width=width;
    597            this.height=height;
    598            this.shadowWidth=shadowWidth;
    599            this.showShadow=showShadow;
    600            this.contentType=contentType;
    601            this.IsDraging=false;
    602            this.oObj=G('dialogBox');
    603            Event.observe(G('dialogBoxTitle'),"mousedown",this.moveStart.bindAsEventListener(this),false);
    604        }
    ,
    605        
    606        moveStart:function (event)
    607        {
    608            this.IsDraging=true;
    609            if(this.contentType==1)
    610            {
    611                G("iframeBG").style.display="";
    612                G("iframeBG").style.width=this.width;
    613                G("iframeBG").style.height=this.height;
    614            }
    ;
    615            Event.observe(document,"mousemove",this.mousemove.bindAsEventListener(this),false);
    616            Event.observe(document,"mouseup",this.mouseup.bindAsEventListener(this),false);
    617            Event.observe(document,"selectstart",this.returnFalse,false);
    618            this.dragData={x:Event.pointerX(event),y:Event.pointerY(event)};
    619            this.backData={x:parseInt(this.oObj.style.left),y:parseInt(this.oObj.style.top)};
    620        }
    ,
    621        
    622        mousemove:function (event)
    623        {
    624            if(!this.IsDraging)
    625                return ;
    626            var iLeft=Event.pointerX(event)-this.dragData["x"]+parseInt(this.oObj.style.left);
    627            var iTop=Event.pointerY(event)-this.dragData["y"]+parseInt(this.oObj.style.top);
    628            if(this.dragData["y"]<parseInt(this.oObj.style.top))
    629                iTop=iTop-12;
    630            else if(this.dragData["y"]>parseInt(this.oObj.style.top)+25)
    631                iTop=iTop+12;
    632            this.oObj.style.left=iLeft;
    633            this.oObj.style.top=iTop;
    634            if(this.showShadow)
    635            {
    636                G('dialogBoxShadow').style.left=iLeft+this.shadowWidth;
    637                G('dialogBoxShadow').style.top=iTop+this.shadowWidth;
    638            }
    ;
    639            this.dragData={x:Event.pointerX(event),y:Event.pointerY(event)};
    640            document.body.style.cursor="move";
    641        }
    ,
    642        
    643        mouseup:function (event)
    644        {
    645            if(!this.IsDraging)
    646                return ;
    647            if(this.contentType==1)
    648                G("iframeBG").style.display="none";
    649                document.onmousemove=null;
    650                document.onmouseup=null;
    651                var mousX=Event.pointerX(event)-(document.documentElement.scrollLeft||document.body.scrollLeft);
    652                var mousY=Event.pointerY(event)-(document.documentElement.scrollTop||document.body.scrollTop);
    653                if(mousX<1||mousY<1||mousX>document.body.clientWidth||mousY>document.body.clientHeight)
    654                {
    655                    this.oObj.style.left=this.backData["x"];
    656                    this.oObj.style.top=this.backData["y"];
    657                    if(this.showShadow)
    658                    {
    659                        G('dialogBoxShadow').style.left=this.backData.x+this.shadowWidth;
    660                        G('dialogBoxShadow').style.top=this.backData.y+this.shadowWidth;
    661                    }
    ;
    662                }
    ;
    663                this.IsDraging=false;
    664                document.body.style.cursor="";
    665                Event.stopObserving(document,"selectstart",this.returnFalse,false);
    666        }
    ,
    667        
    668        returnFalse:function ()
    669        {
    670            return false;
    671        }

    672    }
    ;
    673

    将上面对popup.js文件做个引用,下面是对这个js文件进行测试的html页面的代码。你可以回去很方便的测试。

     1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PopUpTest.aspx.cs" Inherits="PopUpTest" %>
     2
     3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4<html xmlns="http://www.w3.org/1999/xhtml">
     5<head runat="server">
     6    <title>无标题页</title>
     7
     8    <script type="text/javascript" src="Scripts/popup.js"></script>
     9
    10    <script type="text/javascript">
    11    
    12        function ShowIframe()
    13        {
    14            var pop=new Popup({ contentType:1,isReloadOnClose:false,400,height:500});
    15            pop.setContent("contentUrl","Default.aspx");
    16            pop.setContent("title","iframe框架示例");
    17            pop.build();
    18            pop.show();
    19        }

    20        function ShowHtmlString()
    21        {
    22            var strHtml = "<table border=1 style='90%; text-align:center;'><tr style='height:40px'><td>ds</td><td>dads</td></tr><tr style='height:40px'><td>dadas</td><td>dasd</td></tr><tr style='height:40px'><td>dadasd</td><td>dsadads</td></tr></table>";
    23            var pop=new Popup({ contentType:2,isReloadOnClose:false,340,height:300});
    24            pop.setContent("contentHtml",strHtml);
    25            pop.setContent("title","html字符串示例");
    26            pop.build();
    27            pop.show();
    28        }

    29        function ShowConfirm()
    30        {
    31            var pop=new Popup({ contentType:3,isReloadOnClose:false,340,height:80});
    32            pop.setContent("title","confirm对话框示例");
    33            pop.setContent("confirmCon","confirm对话框的内容");
    34            pop.setContent("callBack",ShowCallBack);
    35            pop.setContent("parameter",{id:"divCall",str:"点击确定后显示的字符串",obj:pop});
    36            pop.build();
    37            pop.show();
    38        }

    39        function ShowAlert()
    40        {
    41            var pop=new Popup({ contentType:4,isReloadOnClose:false,340,height:80});
    42            pop.setContent("title","alert警告框示例");
    43            pop.setContent("alertCon","alert对话框的内容");
    44            pop.build();
    45            pop.show();
    46        }

    47        
    48        
    49        function ShowCallBack(para)
    50        {
    51            var o_pop = para["obj"]
    52            var obj = document.getElementById(para["id"]);
    53            o_pop.close();
    54            obj.innerText = para["str"];
    55            
    56        }

    57         
    58    
    </script>
    59
    60</head>
    61<body style="text-align:center;">
    62    <form id="form1" runat="server">
    63        <div>
    64            <href="javascript:ShowIframe()">iframe框架示例</a>
    65            <br />
    66            <href="javascript:ShowHtmlString()">html字符串示例</a>
    67            <br />
    68            <href="javascript:ShowConfirm()">confirm对话框示例</a>
    69            <br />
    70            <href="javascript:ShowAlert()">alert警告框示例</a>
    71        </div>
    72        <div id="divCall" style="300px; height:200px; background-color:#cccccc; color:Red; float:right;">
    73        </div>
    74    </form>
    75</body>
    76</html>
    77


    代码一堆一堆的啊!那个拖拽的不是很清楚怎么回事?上面的那个class函数也不清楚到底是怎么弄的。凡是没有写注释的地方,基本上就不是很明白。我找时间再分析分析吧!找时间把其它的注释也给写上。如果大家明白的,还请多多指教,越详细越好。

    再次声明,此代码供学习研究用。
  • 相关阅读:
    window.onload和document.ready/jquery页面加载事件等的区别
    JAVA面试题大全
    BIO NIO AIO的知识扫盲
    类的加载过程详细解释
    nginx的Rewrite和其他相关配置
    【微服务架构设计】DDD
    【重构】
    【多线程】Lock接口与其实现类
    【三方件】汇总
    【SpringBoot-SpringSecurity】安全响应头+防攻击 ~~ TODO
  • 原文地址:https://www.cnblogs.com/mn232nm/p/722900.html
Copyright © 2011-2022 走看看