首先,为了使元素可拖动,需要给元素添加draggable的 属性,并且设置为 true :
- <div draggable=“true”></div>
当元素拖动时,会发生以下几个事件,虽然跟鼠标的mousedown,mousemove和mouseup类似,但是也有区别:
- ondragstart //拖拽开始
- ondrag //拖拽持续
- ondragend //拖拽结束
这里火狐有个bug,元素拖拽的时候,需要设置一下setData,之后drag和dragend才能正常工作:
ondragstart事件演示(拖动下面的灰色区域):
- div.ondragstart = function(ev){
- var e = ev || window.event;
- e.dataTransfer.setData(‘data’,’val’)
- this.innerHTML=’我被拖拽了’;
- }
ondragend事件演示(拖动下面的灰色区域):
- div.ondragstart = function(ev){
- var e = ev || window.event;
- e.dataTransfer.setData(‘data’,’val’)
- this.innerHTML=’我被拖拽了’;
- }
- div.ondragend = function(){
- this.innerHTML=’拖拽结束’;
- }
ondrag事件演示(拖动下面的灰色区域),需要注意的是,只要你开始了拖拽事件,这里的drag是一直在触发的,哪怕是鼠标静止不动,可以拖动下面的div看效果,这一点跟mousemove不同:
- div.ondrag = function(){
- this.innerHTML=i++;
- }
以上三个事件,是针对拖动对象的,接下来还有三个事件,是针对拖动到某个放置元素上时触发的事件:
- ondragenter //拖动元素进入到放置目标时触发。
- ondragover //拖动元素在放置目标范围内拖动时触发此事件,类似ondrag事件。
- ondragleave //拖动元素离开放置目标时触发此事件
- ondrop //拖动元素在放置目标上释放鼠标时触发
ondragenter和ondragleave事件的演示(拖动下面的灰色区域到目标位置):
- div.ondragstart = function(ev){
- var e = ev || window.event;
- e.dataTransfer.setData(‘data’,’val’)
- }
- target.ondragenter = function(){
- this.style.background=’#999′;
- }
- target.ondragleave = function(){
- this.style.background=’#ccc’;
- }
ondragover和ondrag事件类似,也是一直在触发,前提是鼠标在目标元素上,就不在演示了。
ondrop事件演示,需要注意的是,要想drop事件触发,必须在dragover事件中阻止默认事件。:
- div.ondragstart = function(ev){
- var e = ev || window.event;
- e.dataTransfer.setData(‘data’,’val’)
- }
- target.ondragover = function(ev){
- var e = ev || window.event;
- this.style.background=’#999′;
- ev.preventDefault()
- }
- target.ondragleave = function(){
- this.style.background=’#ccc’;
- }
- target.ondrop = function(){
- this.style.background=’#ccc’;
- alert(‘拖放成功’);
- }
拖放有关的dataTransfer对象:
1. setData和getData。
下面是关于setData和getData的使用,拖动的时候设置data,然后再目标元素释放鼠标来获取data。
- setData(key,value) //设置数据,两个参数
- getData(key) //获取数据,根据key获取
- div.ondragstart = function(ev){
- var e = ev || window.event;
- e.dataTransfer.setData(‘data’,’数据123′)
- }
- target.ondrop = function(ev){
- var e = ev || window.event;
- alert(e.dataTransfer.getData(‘data’));
- }
2. effectAllowed:设置拖拽鼠标的样式
分别有(none,copy,copyLink,copyMove,link,linkMove,move,all,uninitialized),具体不做演示。
- e.dataTransfer.effectAllowed = ‘link’
3. setDragImage设置拖拽的样式,默认拖拽样式是复制一个拖拽元素且半透明的,这个可以设置成其他的。
- //有三个参数,第一个设置成显示的对象,第二个是坐标位置
- e.dataTransfer.setDragImage(o,x,y)
- //这里我把要显示的元素,设置成任意一个div元素,也可以设置成其他元素,或者img图片
- div.ondragstart = function(ev){
- var e = ev || window.event;
- e.dataTransfer.setData(‘data’,’数据123′)
- e.dataTransfer.setDragImage(document.querySelector(‘.dragimg’),0,0)
- }
下面就是根据以上写了一个基本的demo演示,功能类似拖拽添加购物车,点击删除等。
😀 😀 😀 大神啊带带我
亲亲你:cool: 😎 😎