有学有练才叫学习:学而不思则罔,思而不学则殆:学而不习,纸上谈兵,习而不进,画地为牢!

HTML5拖拽/拖放(实现方法)

代码编程 炮渣日记 1个月前 (11-08) 36次浏览 已收录 0个评论 扫描二维码
简介】

拖放是一种常见的特性,属于html5标准的一部分,即抓取对象以后拖动到另一个位置,在html5中,任何元素都可被设置拖放。首先,我们要给需要拖动的HTML元素启用拖动功能,设置属性draggable=”true”,

<div draggable="true"></div>

提示:a标签和img标签默认是启用该属性的,可不需要设置draggable属性。

draggable有三个值,如下所示:

draggable = true(元素可以被拖动)

draggable = false(元素不能被拖动)

draggable = auto(浏览器可以自主决定某个元素是否可以被拖动)

【用法】

当我们用鼠标拖拽目标元素过程中会触发的事件:

ondragstart:用户按下鼠标开始拖动时触发

ondrag:用户正在拖动时反复触发

ondragend:用户结束拖动后触发

  <img      
id="imgs"      
ondragstart="startFun()"      
ondrag="ondragFun()"       
ondragend="ondragendFun()"       
src="../img/a.png"/>

当拖动元素进入目标容器内触发的事件:

ondragenter:鼠标拖动对象进入释放区时触发

ondragover:被拖动物体进入目标容器内移动时反复触发

ondragleave:拖动对象在释放区没有释放就离开容器时触发

ondrop:被拖动物体在目标容器内释放时触发

<div    
id="container"   
ondragenter="ondragenterFun(event)"   
ondragover="ondragoverFun(event)"   
ondragleave="ondragleaveFun()"   
ondrop="drop()"    ></div>

ondragenter和ondragover事件的默认行为是拒绝接受任何被拖放的项目,所以我们必须要做的最重要的事情就是防止这种默认行为的发生

因此,我们只需要在这两个事件调用的函数中传入event对象,使用event.preventDefault()就可取消这种默认行为;举个例子,在drop事件时,Firefox浏览器会关闭网页,转而显示被拖动图片img元素src所引用的地址。

取消元素默认行为:

function ondragenterFun(e){  e.preventDefault();}function ondragoverFun(e){  e.preventDefault();}

在event对象中,我们会使用dataTransfer属性来获取DataTransfer对象,在DataTransfer对象中有我们操作数据的属性和方法,具体如下:

datatransfer:转移释放元素的数据到释放区,返回Datatransfer对象

event.dataTransfer //返回DataTransfer对象

DataTransfer对象的属性:

files:处理从操作系统拖动并释放到释放区的文件;

types:返回一个字符串数组,该对象包含了dataTransfer对象中数据的所有类型;

items:返回DataTransferItems对象,该对象代表了拖动数据;

dropEffect:设置拖放目标允许发生的拖放行为,如果此处设置的拖放行为不在effectAllowed属性设置的可拖放行为内,拖放操作将会失败。该属性值只允许为”null”、”copy”、”link”或”move”;

effectAllowed:设置拖动元素允许发生的拖动行为,该属性值可为”none”、”copy”、”copyLink”、”copyMove”、”link”、”linkMove”、”move”、”all”或”uninitialized”;

DataTransfer对象的方法:

setData( format , data ):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据。

getData( format ):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。

clearData( [format] ):从dataTransfer对象中删除指定格式的数据,参数可选,若不给参数,将删除对象中所有的数据。

setDragImage(el, x, y):设置拖放操作的图标,其中el代表自定义图标,x代表图标与鼠标在水平方向上的距离,y代表图标与鼠标在垂直方向上的距离。

了解了H5拖动使用的api以后我们接下来看一个综合的案例,功能如下:

1)、实现图片拖动功能;

2)、实现图片复制功能;

3)、过滤不能拖动的元素;

4)、实现拖动本地图片到浏览器指定位置;

公共css部分:

<style>   
  #dropIn{       
border:1px solid #AAAAAA;      
height:100px;        
margin-bottom: 10px;       
padding: 10px;    
}     
#dropIn>img{       
margin-right: 10px;       
border:2px solid deepskyblue;    
}     
img{        
  width:100px;        
  border-radius: 10px;       
  border:2px solid red;     
}
</style>

html部分:

  <body>    
    <div id="dropIn"></div> <!--释放区-->    
   <img id="drop1" src="img/a.png" alt="" /> 
  <!--拖动的图片元素-->  
  </body>

js部分:

<script type="text/javascript">  
  var darggID;
function getId(el){    
  return document.getElementById(el)  
} 
var dropId1 = getId("drop1"); 
var dropInId = getId("dropIn"); 
//取消事件默认行为  
dropInId.ondragenter = cancelDefault;  
dropInId.ondragover = cancelDefault;  //绑定拖动元素释放时触发的事件
dropInId.ondrop = drop;  //绑定
dropId1.ondragstart = startFun; 
function cancelDefault(ev){    //取消默认行为    
  ev.preventDefault(); 
}  
function startFun(ev){  
  darggID = ev.target.id;
  //获取被拖动元素的id   
  //从源对象上的事件处理中保存数据,数据类型为"Text"    
  ev.dataTransfer.setData("Text",darggID); 
}  
function drop(ev){   
  ev.preventDefault();    
  // 从目标对象上的事件处理中读取"Text"类型数据      
  var data=ev.dataTransfer.getData("Text");     
  // 插入到目标对象中     
  ev.target.appendChild(document.getElementById(data)); 
}</script>
HTML5拖拽/拖放(实现方法)

接下来我们添加两张图,”drop2″是实现复制的图片,”drop3″是既不能复制也不能拖动的图片;

<img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

添加js代码:

//获取页面元素
var dropId2 = getId("drop2");
var dropId3 = getId("drop3");
//绑定事件
dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;
//修改drop函数为
function drop(ev){    
  ev.preventDefault();  
// 从目标对象上的事件处理中读取"Text"类型数据     
  var data=ev.dataTransfer.getData("Text");     
  if(data=='drop1'){
    //移动        
    ev.target.appendChild(document.getElementById(data));    
  }     
  if(data=='drop2'){//复制       
    var nreEl=document.getElementById(darggID).cloneNode(false);       
    getId("dropIn").appendChild(nreEl);      
  }    
  if(data=='drop3'){//过滤drop3,drop3不做任何操作       
    alert('过滤drop3')     
  } 
}
HTML5拖拽/拖放(实现方法)

接下来我们实现拖动本地图片到浏览器,我们就将图片拖动到id为”dropIn”的这个div中;添加js:

 /*document 监听drop 并阻止浏览器打开客户端的图片*/   
document.ondragover = function (e) {   
  //只有在ondragover中阻止默认行为       
  e.preventDefault();     
};  
document.ondrop = function (e) {  
  //阻止 document.ondrop的默认行为       
  e.preventDefault();    
};  
//dropIn是div的id    
dropIn.ondrop = function (e) {       
  var list = e.dataTransfer.files;       
  for (var i = 0; i < list.length; i++) {            
    var f = list[i];           
    reader(f);       
  }    
};   
function reader(f) {       
  var reader = new FileReader();      
  //读取数据       
  reader.readAsDataURL(f);      
  reader.onload = function () {           
    var img = new Image();           
    img.src = reader.result;           
    dropIn.appendChild(img);        
  }    
}
HTML5拖拽/拖放(实现方法)

【浏览器支持】

目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

最后再和大家分享一个技巧,这种拖动行为还能跨浏览器工作,这里说的跨浏览器不是浏览器之间的跨窗口,而是可以从Chrome浏览器拖动到Firefox浏览器,因为拖放功能的支持是集成在操作系统里面的,有着相同的特性。

我这里就用Chrome浏览器和搜狗浏览器做下演示:

HTML5拖拽/拖放(实现方法)
喜欢 (0)
炮渣日记
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址