首页 > 其他分享 >html5之拖放详解

html5之拖放详解

时间:2023-08-30 09:12:33浏览次数:45  
标签:dataTransfer 拖动 元素 详解 html5 var 拖放 target

拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在 HTML5 中,拖放是标准的一部,任何元素都能够拖放。Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。

1.drggable属性

如果网页元素的draggable元素为true,这个元素就是可以拖动的。

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

注意:在大多数浏览器中,a元素和img元素默认就是可以拖放的,但是为了保险起见,最好还是加上draggable属性。

2.事件

dragstart:网页元素开始拖动时触发。
drag:被拖动的元素在拖动过程中持续触发。
dragenter:被拖动的元素进入目标元素时触发,应在目标元素监听该事件。
dragleave:被拖动的元素离开目标元素时触发,应在目标元素监听该事件。
dragover:被拖动元素停留在目标元素之中时持续触发,应在目标元素监听该事件。
drap:被拖动元素或从文件系统选中的文件,拖放落下时触发。
dragend:网页元素拖动结束时触发。
注意:以上这些事件都可以指定回调函数。

3.dataTransfer对象

拖动过程中,回调函数接受的事件参数,有一个dataTransfer属性。它指向一个对象,包含了与拖动相关的各种信息。

draggableElement.addEventListener('dragstart', function(event) {       event.dataTransfer.setData('text', 'Hello World!');
});

上面代码在拖动开始时,在dataTransfer对象上储存一条文本信息,内容为“Hello World”。当拖放结束时,可以用getData方法取出这条信息。

dataTransfer对象的属性:

**dropEffect:**拖放的操作类型,决定了浏览器如何显示鼠标形状,可能的值为copy、move、link和none。

effectAllowed:指定所允许的操作,可能的值为copy、move、link、copyLink、copyMove、linkMove、all、none和uninitialized(默认值,等同于all,即允许一切操作)。
files:包含一个FileList对象,表示拖放所涉及的文件,主要用于处理从文件系统拖入浏览器的文件。
types:储存在DataTransfer对象的数据的类型。

dataTransfer对象的方法:
**setData(format, data):**在dataTransfer对象上储存数据。第一个参数format用来指定储存的数据类型,比如text、url、text/html等。
**getData(format):**从dataTransfer对象取出数据。
**clearData(format):**清除dataTransfer对象所储存的数据。如果指定了format参数,则只清除该格式的数据,否则清除所有数据。
**setDragImage(imgElement, x, y):**指定拖动过程中显示的图像。默认情况下,许多浏览器显示一个被拖动元素的半透明版本。参数imgElement必须是一个图像元素,而不是指向图像的路径,参数x和y表示图像相对于鼠标的位置。

dataTransfer对象允许在其上存储数据,这使得在被拖动元素与目标元素之间传送信息成为可能。

4.实例讲解

1.网页元素拖放

<!DOCTYPE html><html><head>
    <title>Video step2</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/></head><style>ul{    min-height:100px;    background-color:#EEE;    margin:20px;
}ul li{    background-color:#CCC;    padding:10px;    margin-bottom:10px;
}</style><body>
    <ul id="drag-elements">
        <li draggable="true">A</li>
        <li draggable="true">B</li>
        <li draggable="true">C</li>
    </ul>
    <ul id="drop-target"></ul><script>
    //获取目标元素
    var target = document.querySelector('#drop-target');    //获取需要拖放的元素
    var dragElements = document.querySelectorAll('#drag-elements li');    //临时记录被拖放的元素
    var elementDragged = null;    //循环监听被拖放元素的开始拖放和结束拖放事件
    for (var i = 0; i < dragElements.length; i++) {        //开始拖放事件监听
        dragElements[i].addEventListener('dragstart', function(e) {            //设置当前拖放元素的数据参数
            e.dataTransfer.setData('text', this.innerHTML);            //保存当前拖放对象
            elementDragged = this;
        });        //结束拖放事件监听
        dragElements[i].addEventListener('dragend', function(e) {            //注销当前拖放对象
            elementDragged = null;
        });
    }    //目标元素监听被拖放元素进入事件
    target.addEventListener('dragover', function(e) {        //阻止浏览器默认行为
        e.preventDefault();        //设置鼠标样式
        e.dataTransfer.dropEffect = 'move';        return false;
    });    //目标元素监听当被拖放元素落下时刻事件
    target.addEventListener('drop', function(e) {        //阻止默认行为
        e.preventDefault();        //阻止默认行为
        e.stopPropagation();        //获取当前被拖放元素的存放数据参数
        this.innerHTML = 'Dropped ' + e.dataTransfer.getData('text');        //删除被拖放元素    
               document.querySelector('#dragelements').
               removeChild(elementDragged); 
        return false;
    });</script></body></html>

2.拖动本地文件

假定我们要从文件系统拖动一个txt文本,在浏览器中展示内容。
首先,获取拖动的目标元素和内容展示区域。

var target = document.querySelector('#target');var contentDiv = document.querySelector('#content');

然后,定义目标元素的dragover事件,主要是为了当文件进入目标元素后,改变鼠标形状。

target.addEventListener('dragover', function(e) { e.preventDefault(); e.stopPropagation(); e.dataTransfer.dropEffect = 'copy';});

接着,定义目标元素的drop事件,展示文件内容。

target.addEventListener('drop', function(e) { 
   e.preventDefault(); 
   e.stopPropagation(); v   var fileList = e.dataTransfer.files; 
   if (fileList.length > 0) { 
       var file = fileList[0]; 
       var reader = new FileReader(); 
       reader.end =function(e) { 
       if (e.target.readyState == FileReader.DONE) { 
        var content = reader.result; contentDiv.innerHTML = "File: " + file.name + "\n\n" + content; } } 
       reader.readAsBinaryString(file); 
      }
});

具体代码:

<!DOCTYPE html><html><head>
    <title>Video step2</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/></head><style>#target{    margin:10px;    min-height:100px;    max-height:600px;    background-color:#EEE;    border-radius:5px;    overflow:auto;
}#content{    padding:10px;    font-size:18px;    line-height:25px;
}</style><body>
    <div id="target" title="拖动文件到这里">
    <div id="content"></div></div><script>
    //目标元素监听被拖放文件进入元素区域事件
    target.addEventListener('dragover', function(e) {        //阻止默认行为
        e.preventDefault();        //阻止默认行为
        e.stopPropagation();        //改变鼠标样式
        e.dataTransfer.dropEffect = 'copy';        return false;
    });    //目标元素监听被拖放文件落下一刻的事件
    target.addEventListener('drop', function(e) {        //阻止默认行为
        e.preventDefault();
        e.stopPropagation();        
        //获取所拖放的文件
        var fileList = e.dataTransfer.files;        
        if (fileList.length) {            //获取第一个文件
            var file = fileList[0];            //创建文件输入流
            var reader = new FileReader();            //文件读取回调函数
            reader.end = function(e) {                if (e.target.readyState == FileReader.DONE) {                    var content = reader.result;
                    contentDiv.innerHTML = 'File: ' + file.name + '\n\n' + content;
                }
            }            //读取文件
            reader.readAsBinaryString(file);
        }
    });</script></body></html>

 

标签:dataTransfer,拖动,元素,详解,html5,var,拖放,target
From: https://www.cnblogs.com/delishcomcn/p/17666342.html

相关文章

  • 【性能测试】ulimit命令说明与用法-详解
    目录1、ulimit命令与显示说明2.常用操作-ulimit是临时修改-程序要使用配置得重启3、永久修改的话修改配置文件正文1、ulimit命令与显示说明ulimit命令是Linux系统的内建功能,它具有一套参数集,用于控制shell进程及其所创进程的资源使用限制。它主要用于设置用户和系......
  • 深入详解ThreadLocal
    本文已收录至GitHub,推荐阅读......
  • Windows环境 python手动安装三方库详解
    当运行pip安装三方库时,无法正常安装,可以自己手动安装一下详解:1、首先找到需要下载的三方库的安装包---三方库下载地址:https://pypi.org/project  打开网址搜索需要下载的三方库的安装包,我是以“locust”为例找到需要下载的三方库,点击进去找到对应的版本下载对应的****......
  • 一文详解:人工智能AI技术在智慧矿山安全监管平台建设中的应用及意义
    智慧矿山是这几年的热点话题,伴随着国家对矿业行业的不断重视和扶持,推动矿山智慧化升级改造、保障安全生产也成为当前的重要任务。“智慧矿山”的建设,需要集成应用各类传感感知、信息通讯、自动控制、智能决策等先进信息化技术,能够显著提升矿山生产效率与安全水平,通过先进装备和信......
  • win11安装redis步骤详解
    1、下载及解压    https://www.runoob.com/redis/redis-install.html 2、启动redis 以管理员身份,打开一个cmd窗口, 切换目录到redis安装目录下执行:redis-server.exeredis.windows.conf如果不制定配置文件,那么默认是不需要密码的后面的那个redis.windows.co......
  • Gson与FastJson详解
    Gson与FastJson详解Java与JSON做什么?将Java中的对象快速的转换为JSON格式的字符串.将JSON格式的字符串,转换为Java的对象.Gson将对象转换为JSON字符串转换JSON字符串的步骤:引入JAR包在需要转换JSON字符串的位置编写如下代码即可:Stringjson=newGson().toJSON(要转换的对象......
  • FAST协议详解3 可null(空)类型
    一、概述所谓可null、可空,其实是一个特性的两个方面,某些情况下,我们不需要传递某个字段的值,则可以将该字段“空”起来,不赋值,则接收方在收到该字段时会自动解析为null值。所以空是对于发送方而言,而null则是对于接收方而言,但FAST流中并不会因为没有对该字段赋值就可以节省下一个字节......
  • Gson与FastJson详解
    Gson与FastJson详解Java与JSON做什么?将Java中的对象快速的转换为JSON格式的字符串.将JSON格式的字符串,转换为Java的对象.Gson将对象转换为JSON字符串转换JSON字符串的步骤:引入JAR包在需要转换JSON字符串的位置编写如下代码即可:Stringjson=newGson().toJSON(......
  • 智能指针详解
    文章目录一、智能指针背后的设计思想二、普通指针存在的问题三、shared_ptr类1、make_shared函数2、shared_ptr的拷贝和赋值3、shared_ptr自动销毁所管理的对象4、使用动态内存的原因:5、使用shared_ptr的一个例子:四、shared_ptr的实现和循环引用问题五、weak_ptr类1、weak_ptr详解......
  • Web服务器项目详解
    文章目录一、新连接到来的处理流程二、Channel、TcpConnection、TcpServer、Poller、EventLoop类详解1、Channel类2、TcpConnection类3、TcpServer类4、Poller类5、EventLoop类三、这几个类之间的关系一、新连接到来的处理流程一个新的连接到来后,首先被MainReactor接收,然后通过轮......