首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

22.11  Ajax效果——可拖曳的表格

【实例描述】

Ajax技术已经被越多越多的人关注,其允许用户自己定制界面。本例介绍如何利用Ajax实现可拖曳的表格,允许用户通过拖曳表格定制自己的界面。

【实现代码】

<script defer>

var Drag={dragged:false,ao:null,tdiv:null,dragStart:function()

{  //创建新的DIV

    Drag.ao=event.srcElement;

    if((Drag.ao.tagName=="TD")||(Drag.ao.tagName=="TR")){

        Drag.ao=Drag.ao.offsetParent;

        Drag.ao.style.zIndex=100;

    }else

        return;

    Drag.dragged=true;

    Drag.tdiv=document.createElement("div");

    Drag.tdiv.innerHTML=Drag.ao.outerHTML;

    Drag.ao.style.border="1px dashed red";

    Drag.tdiv.style.display="block";

    Drag.tdiv.style.position="absolute";

    Drag.tdiv.style.filter="alpha(opacity=70)";

    Drag.tdiv.style.cursor="move";

    Drag.tdiv.style.border="1px solid #000000";

    Drag.tdiv.style.width=Drag.ao.offsetWidth;

    Drag.tdiv.style.height=Drag.ao.offsetHeight;

    Drag.tdiv.style.top=Drag.getInfo(Drag.ao).top;

    Drag.tdiv.style.left=Drag.getInfo(Drag.ao).left;

    document.body.appendChild(Drag.tdiv);

    Drag.lastX=event.clientX;

    Drag.lastY=event.clientY;

    Drag.lastLeft=Drag.tdiv.style.left;

    Drag.lastTop=Drag.tdiv.style.top;

},

 draging:function(){                     //判断鼠标的位置

    if(!Drag.dragged||Drag.ao==null)return;

    var tX=event.clientX;

    var tY=event.clientY;

    Drag.tdiv.style.left=parseInt(Drag.lastLeft)+tX-Drag.lastX;

    Drag.tdiv.style.top=parseInt(Drag.lastTop)+tY-Drag.lastY;

    for(var i=0;i<parentTable.cells.length;i++){

        var parentCell=Drag.getInfo(parentTable.cells[i]);

        if(tX>=parentCell.left&&tX<=parentCell.right&&tY>=parentCell. top&&tY<= parentCell.bottom){

            var subTables=parentTable.cells[i].getElementsByTagName("table");

            if(subTables.length==0){

    if(tX>=parentCell.left&&tX<=parentCell.right&&tY>= parentCell.top&&tY<= parentCell.bottom){

                    parentTable.cells[i].appendChild(Drag.ao);

                }

                break;

            }

            for(var j=0;j<subTables.length;j++){

                var subTable=Drag.getInfo(subTables[j]);

                if(tX>=subTable.left&&tX<=subTable.right&&tY>=subTable. top&&tY<= subTable.bottom){

                    parentTable.cells[i].insertBefore(Drag.ao,subTables[j]);

                    break;

                }else{

                    parentTable.cells[i].appendChild(Drag.ao);

                }  

            }

        }

    }

},

 dragEnd:function(){  //拖曳完毕

    if(!Drag.dragged)return;

    Drag.dragged=false;

    Drag.mm=Drag.repos(150,15);

    Drag.ao.style.borderWidth="0px";

    Drag.ao.style.borderTop="1px solid #3366cc";

    Drag.tdiv.style.borderWidth="0px";

    Drag.ao.style.zIndex=1;

},

getInfo:function(o){     //取得坐标

    var to=new Object();

    to.left=to.right=to.top=to.bottom=0;

    var twidth=o.offsetWidth;

    var theight=o.offsetHeight;

    while(o!=document.body){

        to.left+=o.offsetLeft;

        to.top+=o.offsetTop;

        o=o.offsetParent;

    }

        to.right=to.left+twidth;

        to.bottom=to.top+theight;

    return to;

},

repos:function(aa,ab){

    var f=Drag.tdiv.filters.alpha.opacity;

    var tl=parseInt(Drag.getInfo(Drag.tdiv).left);

    var tt=parseInt(Drag.getInfo(Drag.tdiv).top);

    var kl=(tl-Drag.getInfo(Drag.ao).left)/ab;

    var kt=(tt-Drag.getInfo(Drag.ao).top)/ab;

    var kf=f/ab;

    return setInterval(function(){if(ab<1){

                            clearInterval(Drag.mm);

                            Drag.tdiv.removeNode(true);

                            Drag.ao=null;

                            return;

                        }

                    ab--;

                    tl-=kl;

                    tt-=kt;

                    f-=kf;

                    Drag.tdiv.style.left=parseInt(tl)+"px";

                    Drag.tdiv.style.top=parseInt(tt)+"px";

                    Drag.tdiv.filters.alpha.opacity=f;

                },aa/ab)

},

 inint:function(){   //初始化表格

    for(var i=0;i<parentTable.cells.length;i++){

        var subTables=parentTable.cells[i].getElementsByTagName("table");

        for(var j=0;j<subTables.length;j++){

            if(subTables[j].className!="dragTable")break;

            subTables[j].rows[0].className="dragTR";

            subTables[j].rows[0].attachEvent("onmousedown",Drag.dragStart);

        }

    }

    document.onmousemove=Drag.draging;

    document.onmouseup=Drag.dragEnd;

}

}

Drag.inint();

</script>

拖曳标题栏需要专门的样式。本例主要用到的样式表如下所示:

<style>

*{font-size:12px}

.dragTable{

    font-size:12px;

    border-top:1px solid #3366cc;

    margin-bottom: 10px;

    width:100%;

    background-color:#FFFFFF;

}

td{vertical-align:top;}

.dragTR{

    cursor:move;

    color:#7787cc;

    background-color:#e5eef9;

    height:20px;

    padding-left:5px;

    font-weight:bold;

}

#parentTable{

    border-collapse:collapse;

    letter-spacing:25px;

}

</style>

需要在body中添加table,由于代码内容比较多,此处未给出,可从随书光盘中获取。

【运行效果】

表格的运行效果如图22-11所示。表格的拖曳效果如图22-12所示。

     

图22-11  表格的运行效果                       图22-12  表格的拖曳效果

【难点剖析】

本例中script元素后面不再是“language=’javascript’”的属性,而使用了“defer”。“defer”表示在页面加载完毕后再运行JavaScript代码,这样可以防止出现找不到对象的问题。“defer”还可以使脚本在后台被下载,前台的内容则正常显示给用户。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论