热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTML5原生拖放实例分析

HTML5提供了原生拖放功能的JavaScriptAPI,使用起来很方便。兼容性:对于PC端浏览器,Firefox、Chrome、Safari支持良好,而IE和Edge浏览器有些特性不支持,如IE

HTML5提供了原生拖放功能的Javascript API,使用起来很方便。

兼容性:

  title='鞋子'/>
<img src="http://d2.freep.cn/3tb_160909012718973d572240.jpg" title='包子'/>
<img src="http://d2.freep.cn/3tb_1609090127197ux5572240.jpg" title='薯片'/>
div>
<div id='cart'>div>
div> View Code 

CSS代码:

*{
margin
: 0;
padding
: 0;
}
body
{
-webkit-user-select
: none;
-moz-user-select
: none;
-ms-user-select
: none;
user-select
: none;
}
#wrap
{
height
: 100px;
text-align
: center;
}
img
{
width
: 100px;
height
: 100px;
cursor
: -webkit-grab;
cursor
: -moz-grab;
cursor
: grab;
}
#cart
{
width
: 500px;
height
: 100px;
border-radius
: 20px;
margin
: 50px auto 0;
background-color
: orange;
}
#cart.hover
{
background-color
: red;
}
#cart img
{
width
: 70px;
height
: 70px;
margin
: 15px;
}
View Code

JS代码:

//被拖动元素的三个事件
function dragstart(e){
e
= EventUtil.getEvent(e);
var target = EventUtil.getTarget(e);
e.dataTransfer.setData(
"text",target.title);
//因为IE10、IE11和Edge不支持setDragImage()方法,需要判断
if(e.dataTransfer.setDragImage){
e.dataTransfer.setDragImage(target,
50,50);
}

//effectAllowed事件和dropEffect事件搭配使用
e.dataTransfer.effectAllowed = 'move';
dragElement
= target;
}
function drag(e){
e
= EventUtil.getEvent(e);
var target = EventUtil.getTarget(e);
setOpacity(target,
0);
}
function dragend(e){
e
= EventUtil.getEvent(e);
var target = EventUtil.getTarget(e);
setOpacity(target,
1);
}

//放置目标的四个事件
function dragenter(e){
e
= EventUtil.getEvent(e);
var target = EventUtil.getTarget(e);
//重要!重写dragenter事件的默认行为,使其可以触发drop事件
EventUtil.preventDefault(e);
//dropEffect事件和effectAllowed事件搭配使用
e.dataTransfer.dropEffect = 'move';
target.className
= 'hover';
}
function dragover(e){
e
= EventUtil.getEvent(e);
//重要!重写dragover事件的默认行为,使其可以触发drop事件
EventUtil.preventDefault(e);
}
function dragleave(e){
e
= EventUtil.getEvent(e);
var target = EventUtil.getTarget(e);
target.className
= '';
}
function drop(e){
e
= EventUtil.getEvent(e);
var target = EventUtil.getTarget(e);
var title = e.dataTransfer.getData("text");
console.warn(
'把%s添加到购物车中!',title);
target.className
= '';
dragElement.parentNode.removeChild(dragElement);
var img = dragElement.cloneNode();
img.draggable
= false;
setOpacity(img,
1);
cart.appendChild(img);

//重要!为了让Firefox支持正常的拖放,取消drop事件的默认行为
EventUtil.preventDefault(e);
}


//设置透明度
function setOpacity(element,value){
if(typeof element.style.opacity!='undefined'){
element.style.opacity
=value;
}
else{
element.style.filter
= "alpha(opacity="+value*100+")";
}
}
//事件处理,做兼容处理
var EventUtil={
//添加事件处理程序
addHandler:function(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,
false);
}
else if(element.attachEvent){
element.attachEvent(
"on"+type,handler);
}
else{
element[
"on"+type]=handler;
}
},
//获取事件对象
getEvent:function(event){
return event?event:window.event;
},
//获取事件的目标
getTarget:function(event){
return event.target||event.srcElement;
},
//取消默认事件
preventDefault:function(event){
if(event.preventDefault){
event.preventDefault();
}
else{
event.returnValue
=false;
}
}
};

var imgs = document.getElementsByTagName("img"),
cart
= document.getElementById('cart'),
dragElement
= null;

for(var i=0; i ){
EventUtil.addHandler(imgs[i],'dragstart',dragstart);
EventUtil.addHandler(imgs[i],
'drag',drag);
EventUtil.addHandler(imgs[i],
'dragend',dragend);
}
EventUtil.addHandler(cart,
'dragenter',dragenter);
EventUtil.addHandler(cart,
'dragover',dragover);
EventUtil.addHandler(cart,
'dragleave',dragleave);
EventUtil.addHandler(cart,
'drop',drop);
View Code

参考资料: 《Javascript高级程序设计》,MDN


推荐阅读
author-avatar
强悍的梅子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有