基于JS的WEB会议室预订拖拽式图形界面的实现

时间:2021-10-21 02:54:22

 

06年的一篇blog,转到这个博客上:      

 

       很早之前写的,后来由于这个功能模块取消,最终没有上线,所以与Server交互的那部分还没有写,不过那部分方案我也已经出来了,而且现在客户端这一部分已经通过了比较完备的测试。大家看看这一部分的代码,应该一看就懂。 那时候也不知道那么多js的UI库,所以全部都是自己绘制的,界面有点简陋,希望凑或者看吧,再就是我们这个项目是局域网项目,所以大家用的都是IE,没有考虑跨浏览器的因素。发出来希望对做同样应用的同志少走点弯路,我写的时候,网上没有这方面的代码,现在有没有就不知道了。

 

网页代码:

<%@page contentType="text/html; charset=gb2312" pageEncoding="GB2312" %>  
<%@ page language="java"%>  
<%@ page import="java.util.List" %>  
<style>  
th.timem      {font-size: 8pt; font-family: Times New Roman;}  
td.reserved   {background-color: #FF0066}  
td.free       {background-color: #99CCFF}  
td.selected   {background-color: #ccCCFF}  
</style>  
<script language="JavaScript" type="text/javascript" src="timetable.js"></script>  
<script>  
<!--  
    var dragging=false;//是否在拖拽  
    var OrignCell="";//开始格位  
    var CurrentCell="";//当前格位  
    var pope;  
    window.onload=function()  
    {  
        try{  
            pope=document.getElementById("pop");  
            var tp=document.getElementById('TablePosition');  
            var tt=CreateTable();  
            tp.appendChild(tt);  
            SetReserves();  
            document.getElementById('2-5').className="reserved";  
                document.getElementById('5-10').className="reserved";//for test  
        }catch(e)  
        {  
            alert(e.name + ": " + e.message);  
        }  
    }  
       //设置已预订单元  
    function SetReserves()  
    {  
        //Insert the Reserved Cells Intialation by SetReserve()  
          
    }  
-->  
</script>  
<div id="pop" style="position:absolute;width:50; display: none; z-index:99; font-size: 13px; background:#FFCCFF;filter:alpha(opacity=40); border-style: solid; border-width: thin;border-color:#FF66CC; " >  
<div onclick="Reserve()" style="{cursor: hand;} ">预订</div>  
<hr size=0.1 color=#FF66CC;>  
<div onclick="Cancel()"style="{cursor: hand;} ">取消</div>  
</div>  
<div id="TablePosition"  >  
</div>  
//创建会议室预订情况时间表  
    function CreateTable()  
    {  
        var tt=document.createElement("table");  
        var tbody=document.createElement("tbody");  
        tt.onmouseout=OutDragT;  
        tbody.onmouseout=CancleBubble;  
        tt.appendChild(tbody);  
        tt.border='1';  
        tt.id='TimeTable';  
        tt.cellSpacing ="1";//???????????  
        tt.borderColor="#6699ff";  
        tt.align='center';  
        tt.onselectstart =False;   
        for(var i=0;i<6;i++)  
        {  
            var tr=document.createElement("tr");  
            for(var j=0;j<18;j++)  
            {  
                var hd=document.createElement("td");  
                hd.id=i+'-'+j;  
                hd.innerHTML=" ";  
                hd.onmousedown = BeginDrag;  
                        hd.onmousemove = OnDrag;  
                        hd.onmouseup = EndDrag;  
                hd.className="free";///for test  
                hd.onmouseover=onshow;  
                if(i==0)  
                {  
                    hd=document.createElement("th");  
                    hd.className='timem';  
                    hd.width='30';  
                    if(j==0)  
                    {  
                        hd.innerHTML=" "  
                    }else{  
                        var hour=8+Math.floor(j/2);  
                        var minutes=30*(j%2);  
                        hd.appendChild(document.createTextNode(hour+':'+minutes));  
                    }  
                }  
                if(j==0&&i!=0)  
                {  
                    hd=document.createElement("th");  
                    hd.className='timem';  
                    hd.appendChild(document.createTextNode('?'+i));  
                }  
                tr.appendChild(hd);  
            }  
            tbody.appendChild(tr);  
        }  
  
  
        return tt;      
    }  
  
    function SetReserve(id)  
    {  
        document.getElementById(id)="reserved";  
    }  
    //取消事件冒泡  
    function CancleBubble()  
    {  
        event.cancelBubble=true;  
    }  
    //拖拽选择开始函数  
    function BeginDrag()  
    {  
        if (event.button != 1)  
        {  
            return;  
        }  
        OrignCell=this.id;  
        CurrentCell=this.id;  
        if(ModifyClass())  
        {          
               dragging=true;  
        }else{  
            alert("????????!");  
            OrignCell="";  
            CurrentCell="";  
        }  
    }  
   //拖拽过程处理函数  
    function OnDrag()  
    {  
        if(dragging==false||this.id==CurrentCell)  
        {  
            return;  
              
        }  
        CurrentCell=this.id;  
        if(!ModifyClass())  
        {  
            Reverse()  
            dragging=false;  
            OrignCell="";  
                    CurrentCell="";  
            pope.style.display = 'none';  
            alert("?????????????!");  
              
        }          
    }  
    //结束拖拽  
    function EndDrag()  
    {  
        if(dragging==false)  
        {  
            return;  
        }  
        dragging==false;  
        pope.style.top=event.clientY  
        pope.style.left=event.clientX  
        pope.style.display = "";  
    }  
    //本为处理鼠标过界操作后作他用  
    function OutDrag()  
    {      
        if(dragging==false)  
        {  
            return;  
        }  
        //???  
        Reverse();  
        dragging=false;  
      
    }  
    //Handler for mousemoveout of timetable  
    function OutDragT()  
    {  
        var Tt=document.getElementById("TimeTable");  
            if(event.clientX<=Tt.offsetLeft||event.clientX>=(Tt.offsetLeft+Tt.offsetWidth)||event.clientY<=Tt.offsetTop||event.clientY>=(Tt.offsetTop+Tt.offsetHeight))  
        {  
            OutDrag();  
            window.status="";  
        }  
    }  
    function False()  
    {  
         return false;  
    }  
    //修正各单元格的状态并返回结果  
    function ModifyClass()  
    {  
          
        Reverse();  
      
        for(var i=X1();i<=X2();i++)  
        {  
            for(var j=Y1();j<=Y2();j++)  
            {  
                var CName =document.getElementById(i+"-"+j).className;  
                if(CName.indexOf("reserved")!=-1)  
                {  
                    return false;  
                }  
                if(CName.indexOf("selected")!=-1)  
                {  
                    continue;  
                }  
                if(CName.indexOf("free")!=-1)  
                {  
                    document.getElementById(i+"-"+j).className="selected";  
                }                  
            }  
        }  
        return true;  
    }  
    //返回初始状态  
    function Reverse()  
    {  
        for(var i=1;i<6;i++)  
        {  
            for(var j=1;j<18;j++)  
            {  
                var CName =document.getElementById(i+"-"+j).className;  
                if(CName.indexOf("selected")!=-1)  
                {  
                    document.getElementById(i+"-"+j).className="free";      
                }  
            }              
        }  
    }  
    //取消选择  
    function Cancel()  
    {  
        pope.style.display = 'none';  
        OutDrag();  
        dragging=false;  
    }  
    //预订操作  
    function Reserve()  
    {  
        pope.style.display = 'none';  
        alert("????!")  
        dragging=false;  
    }  
    //选择区域的横方向小坐标  
    function X1()  
    {  
        var Bx,Ex;  
        var TArray=OrignCell.split('-');  
        Bx=parseInt(TArray[0]);  
        TArray=CurrentCell.split('-');  
        Ex=parseInt(TArray[0]);  
        return Bx<=Ex?Bx:Ex;  
          
    }  
    //选择区域的横方向大坐标  
    function X2()  
    {  
        var Bx,Ex;  
        var TArray=OrignCell.split('-');  
        Bx=parseInt(TArray[0]);  
        TArray=CurrentCell.split('-');  
        Ex=parseInt(TArray[0]);  
        return Bx>=Ex?Bx:Ex;  
    }  
    //选择区域的纵方向小坐标  
    function Y1()  
    {  
        var Bx,Ex;  
        var TArray=OrignCell.split('-');  
        Bx=parseInt(TArray[1]);  
        TArray=CurrentCell.split('-');  
        Ex=parseInt(TArray[1]);  
        return Bx<=Ex?Bx:Ex;  
    }  
    //选择区域的纵方向大坐标  
    function Y2()  
    {  
        var Bx,Ex;  
        var TArray=OrignCell.split('-');  
        Bx=parseInt(TArray[1]);  
        TArray=CurrentCell.split('-');  
        Ex=parseInt(TArray[1]);  
        return Bx>=Ex?Bx:Ex;  
    }  
    //显示选择情况!  
    function onshow()  
    {  
        window.status="Cell:"+OrignCell+"::"+CurrentCell+dragging;  
    }