http://www.w3cmm.com/html/drag.html
上面这个是html5的拖拽api的说明
里面有你想要的解释
然后你里面的一些小问题,我给你说明一下
function dragStart(evt){evt=evt||window.event//为什么用evt而不直接写dragstart(event)
evt.dataTransfer.effectAllowed="copy"
//evt.dataTransfer.effectAllowedd的值
//“none”、“copy”、“copyLink”、“copyMove”、“link”、
//“linkMove”、“move”、“all”分别是什么作用?
evt.dataTransfer.setData("Text",item.id)
//evt.dataTransfer.setData(format,data)
//中,data是不是指数据的内容,比如evt.dataTransfer.setData("Text",item.id)这句话就是把item元素的
//id复制到粘贴板上以进行下一步调用?
evt=evt||window.event//为什么用evt而不直接写dragstart(event)
这个问题是,在除ie以外的浏览器中,evt对象(event的缩写)是直接通过参数传递的变量
在ie中,浏览器并没有把event传递给你,而是把它绑定到window.event这个属性上了
所以在这里处理的时候,需要做一个判断,如果存在evt就直接使用evt,否则用window.event
evt.dataTransfer.effectAllowed="copy"
这个属性在上面的链接里面有解释
evt.dataTransfer.setData("Text",item.id)
这个方法的setData参数的第一个,只支持俩个属性Text , Url,
也就是只能保存这俩种数据类型
在上面的链接里面也有详细的解释
evt.dataTransfer
为了在拖放操作时实现数据交换,这个属性就是用来保存一个临时的数据用的
你可以在拖放动作中,吧数据保存在这个属性中,用setData,然后在处理函数中用getData
拿到保存的数据来做处理
整个流程是这样的
<div id="item"></div>
<div id="drop"></div>
就是把item拖拽到drop上的时候,把item放到drop里面
首先,给item绑定一个drapstart的拖拽开始事件,需要把item的draggable属性设置为true
标识这个元素是可以拖拽的
在这个拖拽的动作中(drapstart),把item的id保存到evt.dataTransfer属性里面
并且设置这个元素可以执行的放置行为(effectAllowed),copy,也就是复制
然后给drop绑定鼠标的释放事件(drop)
在这里取到保存在evt.dataTransfer里面的item的id
然后drop.appendChild(document.getElemntById(id))
把这个元素放置到drop元素里面
整体流程就是这样的
你那里的target属性就是drop这个元素了,只不过你的那个貌似是onload方法里面的一个局部变量,外面似乎访问不到,你可以把它的var声明放在外面就可以了
因为需要计算元素的位置变化,所以需要掌握几个关于位置的api
点击需要拖动元素时,获取该元素的初始位置。
鼠标移动期间 获取元素当前的位置信息
计算
进行事件监听
拖拽的实现原理:通过事件mousedown(事件的触发) →mousemove(事件的控制) →mouseup(事件的清除),拖拽的过程就是mousemove阶段;
问题产生的原因:因为mousemove 的间隔性触发,当两次mousemove事件触发的间隔中,鼠标移动距离出了element的范围,就会产生鼠标脱离element范围,拖拽就停止,
解决方法: 将mousemove事件挂在docment,而不是对应的element,此时鼠标滑动只要不出docment范围就不会触发上述情况。
拖动事件完成的动作时是:mousedown(事件的触发) →mousemove(事件的控制) →mouseup(事件的清除) 但是mouseup的时候 同时会触发 点击事件(如果元素上面有点击事件的话)
处理办法:记录mousedown(记录开始时间) →mousemove→mouseup(记录结束时间) 的时间 根据时间长短判断是进行了点击事件还是进行了拖拽事件。
正常需求的话 就希望拖拽元素只在屏幕的可视范围内进行拖拽,不能跑出去。
在onmousemove 中添加边缘控制就好,具体范围可以根据具体需求更改。
<script type="text/javascript"><!--$(document).ready(function()
{
$(".show").mousedown(function(e)//e鼠标事件
{
$(this).css("cursor","move")//改变鼠标指针的形状
var offset = $(this).offset()//DIV在页面的位置
var x = e.pageX - offset.left//获得鼠标指针离DIV元素左边界的距离
var y = e.pageY - offset.top//获得鼠标指针离DIV元素上边界的距离
$(document).bind("mousemove",function(ev)//绑定鼠标的移动事件,因为光标在DIV元素外面也要有效果,所以要用doucment的事件,而不用DIV元素的事件
{
$(".show").stop()//加上这个之后
var _x = ev.pageX - x//获得X轴方向移动的值
var _y = ev.pageY - y//获得Y轴方向移动的值
$(".show").animate({left:_x+"px",top:_y+"px"},10)
})
})
$(document).mouseup(function()
{
$(".show").css("cursor","default")
$(this).unbind("mousemove")
})
})
// --></script>