日期:2014-05-16  浏览次数:20705 次

ajax怎样实现拖动排名? - Web 开发 / Ajax
我想做一个投票系统,在众多候选中选出前10名。
用鼠标将参与投票者拖到排行榜中,让其成为10个之一,如果10个已满,则会挤出最后一名。也可以在排行榜中自由拖动各个候选人的顺序,自由排序。然后点提交,将结果提交给系统。
请问这样一个要求,用ajax怎样实现?请高手们提供一些方法或者建议。如果能够源码或者例子那就更好了。
望大虾们不吝赐教,我的邮箱是xuntaohm@163.com

为了更加形象说明,我画了个示意图:


------解决方案--------------------
这个要用到鼠标的拖拽事件,用这2个事件就可以搞定了。就像有的blog自定义布局,但是要保存到数据库。

JScript code

<script> 
var x,y,z,down=false,obj    
function init(){ 
obj=event.srcElement      //事件触发对象 
obj.setCapture()             //设置属于当前对象的鼠标捕捉 
z=obj.style.zIndex           //获取对象的z轴坐标值 
//设置对象的z轴坐标值为100,确保当前层显示在最前面 
obj.style.zIndex=100 
x=event.offsetX    //获取鼠标指针位置相对于触发事件的对象的X坐标 
y=event.offsetY    //获取鼠标指针位置相对于触发事件的对象的Y坐标 
down=true          //布尔值,判断鼠标是否已按下,true为按下,false为未按下 
} 

function moveit(){ 
//判断鼠标已被按下且onmouseover和onmousedown事件发生在同一对象上 
if(down&&event.srcElement==obj){ 
    with(obj.style){ 
/*设置对象的X坐标值为文档在X轴方向上的滚动距离加上当前鼠标指针相当于文档对象的X坐标值减鼠标按下时指针位置相对于触发事件的对象的X坐标*/ 

         posLeft=document.body.scrollLeft+event.x-x 
/*设置对象的Y坐标值为文档在Y轴方向上的滚动距离加上当前鼠标指针相当于文档对象的Y坐标值减鼠标按下时指针位置相对于触发事件的对象的Y坐标*/ 
         posTop=document.body.scrollTop+event.y-y 
    } 
} 
} 

function stopdrag(){ 
//onmouseup事件触发时说明鼠标已经松开,所以设置down变量值为false 
down=false 
obj.style.zIndex=z        //还原对象的Z轴坐标值 
obj.releaseCapture() //释放当前对象的鼠标捕捉 
} 
</script> 

<div onmousedown=init() onmousemove=moveit() onmouseup=stopdrag() style="position:absolute;left:20;top:190;width:100;height:150;border:1px solid #000000;z-index:1;background:#eeeeee">Layer 1</div> 
<div onmousedown=init() onmousemove=moveit() onmouseup=stopdrag() style="position:absolute;left:60;top:10;width:100;height:150;border:1px solid #000000;z-index:2;background:#eeeeee">Layer 2</div> 
<div onmousedown=init() onmousemove=moveit() onmouseup=stopdrag() style="position:absolute;left:100;top:90;width:100;height:150;border:1px solid #000000;z-index:3;background:#eeeeee">Layer 3</div> 

注意:只有 CSS 的 position 属性值为 absolute 的对象才能进行拖动操作。 
提示:如果需要将拖曳组件化,可以参考第二部分HTC一节。 
技巧:可以在 init() 函数中加一句 event.cancelBubble=true ,以取消在该对象上的事件冒泡。 
试一试:读者可以试着实现移动其他对象,例如移动一个图片或文本框。 
特别提示 
在拖曳对象前必须确保该对象的为绝对定位的,把上面的完整代码保存就可以看到效果了,在实际就用时务必在对象上加上 onmousedown、onmousemove和onmouseup三个事件并触发相应函数。代码运行效果如图 3.8 所示。 

图 3.8 可拖动的层 


特别说明

本例需要掌握的技巧比较多,捕捉鼠标,获取鼠标位置(相当于对象),释放鼠标捕捉,文档的滚动距离还有with 语句。 
1.        setCapture() 设置属于当前文档的对象的鼠标捕捉。 
2.        event.offsetX 设置或获取鼠标指针位置相对于触发事件的对象的 x 坐标。 
3.        event.offsetY 设置或获取鼠标指针位置相对于触发事件的对象的 y 坐标。 
4.        releaseCapture() 释放当前文档中对象的鼠标捕捉。 
5.        scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。 
6.        scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。 
7.        with 为一个或多个语句设定默认对象。