拖拽要有两个元素,一个是要拖动的元素,一个是要放置到的元素。

  1, 在默认情况下, 只有图片和文字是可以拖拽的,其它元素都不可以。因此要想使一个元素可拖动,必须设置它的draggable 属性为true, 在firefox浏览器中,还要在拖动元素的dragstart事件下,设置event.datatransfer.setData(),设置拖动的时候携带的数据 。这里要注意,draggable 是布尔值属性,一般布尔值属性,只要写上就表示它是true, 如checked 属性,但这里不是,一定要写全了 <div draggable="true"></div>

  2, 在拖动的时候,我们可以看到,我们拖动的只是一个副本,元素在其原来位置上没有任何变化。

  3, 在拖动的过程中,我们鼠标状态一直是一个圆圈,中间加一根横杆。表示禁止状态。这表明,在默认状态下,一个元素不允许放在另一个元素的上面。

  4,  在拖动的元素上,会触发三个事件,dragstart, drag, dragend.

    dragstart : 拖动开始的时候触发。在元素上面,按下鼠标左键,拖动的一瞬间触发。

      dragend: 松开鼠标后触发。

      drag: 拖动的过程中,持续触发。也就是 按下鼠标左键拖动到松开鼠标过程中,一直触发这个事件。

  要放置到的元素:我们拖动一个元素放到另一个元素身上。上面已经说过:在默认情况下,一个元素是不能放到另一个元素上面,因此这要阻止事件的默认行为。怎样才能阻止事件的默认行为? 这里要说到我们要放置到的元素,也就是目标元素,有四个事件。

      dragenter:其他元素进入时触发,

      dragover: 其他元素在其上面时触发,

      dragleave, 其他元素离开时触发,

      还有一个drop事件,拖动其他元素在其上面,然后释放鼠标时触发。

  dragover : 拖动元素在目标元素上触发,所以只要在dragover事件中阻止事件的默认行为,就可以把元素放到另一个元素身上。这时拖动元素到目标元素上时,鼠标状态变成了复制状态。

  dragdrop: 拖动元素在目标元素上,并且释放鼠标。它主要用于获取拖动元素的信息。这里还有一个默认事件,如果从桌面拖动一张图片到目标元素上,然后,释放鼠标,它会在一个新的页面打开图片。释放一个文件在目标元素上,它会以链接的方式打开元素。阻止默认事件后,不会打开文件。

  如果想读取或显示我们拖入的文件, 那就用到file API.  在dropover 事件中,我们拖入的文件信息保存在e.datatransfer.files 数组中。它是一个类数组,有一个length属性,显示我们一共放入了多少文件,通过提供索引可以访问任何一个文件, var filelist = e.datatransfer.files ; filelist[0] 就表示第一个文件。每一个文件都有name, type, size 属性, filelist[0].size 表示文件大小。

  如果想进一步读取文件,就要用到了,FileReader Api.  FileReader  是一个对象,使用之前,先实例化。读取方式有三种,FileReader.readAsArrayBuffer()    FileReader.readAsDataURL()   FileReader.readAsText() ,它们都接受一个文件,作为参数, 通过名字可以看出它们读取的方式不一样, arrayBuffer, 读取的结果以二进制数组返回。还有一个abort 方法,中断读取。

  读取的过程中会有几个事件:

  Onload, onerror, onprogress. 这和ajax 是一致的,读取完成后,触发onload 事件。Onload事件里面通过this.resault 获取了读取的结果。

dragZone.ondrop = function(e){   // 打开方式是以链接的方进打开,阻止默认行为

            var filefirst = e.dataTransfer.files[0];
            var fileR = new FileReader();
            fileR.readAsDataURL(filefirst);
            fileR.onload = function(){
                var img = document.createElement("img");
                img.src = this.result;
                dragZone.appendChild(img);
            }
            e.preventDefault();

        }

Html5 拖拽api的更多相关文章

  1. 基于html5拖拽api实现列表的拖拽排序

    基于html5拖拽api实现列表的拖拽排序 html代码: <ul ondrop="drop_handler(event);" ondragover="dragov ...

  2. jQ插件--时间线插件和拖拽API

    这个时间轴是工作上用到的,自己写了一个, qq空间有时间轴的控件, 百度文库也有时间轴的控件: 百度的时间轴大概是这样的: 用户点击对应的锚链接,  那个三角会滚动, 然后左侧的界面也会滚动: 实际的 ...

  3. HTML5拖拽功能中 dataTransfer对象详解

    有了HTML5,老板再也不用担心我们的上传了,再加上有拖拽上传是不是很酷.百度一下,有关HTML5拖拽上传的文章和实例不少,都缺不了一个至关重要的东东DataTransfer.但是详细介绍的不多,尤其 ...

  4. Html5拖拽复制

    拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需 ...

  5. html5拖拽

    html5拖拽一 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  6. HTML5 拖拽复制功能的实现方法

    Internet Explorer 9FirefoxOpera 12ChromeSafari 5 v1.0代码部分 <!DOCTYPE html><html><head& ...

  7. 每天一个JavaScript实例-html5拖拽

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. HTML5拖拽练习

    HTML5提供专门的拖拽与拖放的API,以后实现这类效果就不必乱折腾了 相关属性和事件如下: 1.DataTransfer 对象:退拽对象用来传递的媒介,使用一般为Event.dataTransfer ...

  9. html5 拖拽(drag)和f放置(drop)

    知识要点 HTML5 (drag&drop) API  (Event) 拖放数据(对象):DataTransfer 拖放内容:setData getData 拖放效果(动作):dropEffe ...

随机推荐

  1. 从零开始搭建django前后端分离项目 系列三(实战之异步任务执行)

    前面已经将项目环境搭建好了,下面进入实战环节.这里挑选项目中涉及到的几个重要的功能模块进行讲解. celery执行异步任务和任务管理 Celery 是一个专注于实时处理和任务调度的分布式任务队列.由于 ...

  2. 【C# 复习总结】类、继承和接口

    1 类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指 ...

  3. Mac无法清倒废纸篓,终极解决方案

    打开终端 输入 sudo -s rm -rf 你的文件路径 回车即可成功删除

  4. vue 生产环境 background 背景图不显示原因

    通常我们使用img标签引入文件,npm run build 打包后 ,因为img为html标签,打包后他的路径是由index.html开始访问的,他走static/img/'图片名'是能正确访问到图片 ...

  5. hibernate中实体与数据库中属性对应的类型

    常用的字段及类型,在数据库中字段名称若与实体对应的属性字段名称相同,hibernate可以自动映射,在一些情况下hibernate可能报错这时候有的错误可以通过指定对应的类型避免.下面给出一些常用的 ...

  6. ElasticSearch 分组查询的几个例子

    facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思. "terms_stats& ...

  7. 通过 MySQL 存储原理来分析排序和锁(转)

    先抛出几个问题 为什么不建议使用订单号作为主键? 为什么要在需要排序的字段上加索引? for update 的记录不存在会导致锁住全表? redolog 和 binlog 有什么区别? MySQL 如 ...

  8. [转帖]漫画趣解Linux内核

    漫画趣解Linux内核 https://blog.csdn.net/juS3Ve/article/details/84207142 Linux 内核漫画 今天,我来为大家解读一幅来自 TurnOff. ...

  9. C# Note14: Editable WPF ListView

    (1)https://stackoverflow.com/questions/5652527/editable-wpf-listview (2)How to: Create a ListView wi ...

  10. 模仿jdk编译代码去除注释,多行注释

    package com.jachs.mvc; import java.*; import ch.qos.logback.classic.net.SyslogAppender; /**** * * @a ...