终于弄懂了HTML5的拖放API(2)

HTML5的拖放(drag和drop)第二部分

👉 HTML5的拖放(drag和drop)第一部分内容请点击这里哦

放置元素

放置元素我们可以称为指定的放置目标。

网页或应用程序的大部分区域都是不可以放置数据的,默认不允许放置元素。如果需要设置允许放置,必须在dragenterdragover事件中阻止默认事件。

有两种阻止方式:

<div ondragover="return false">
<div ondragover="event.preventDefault()">

想要让元素变成可释放元素的区域,必须给元素设置dragoverdrop事件。

基础示例:

  <!-- 可放置元素 -->
  <div
    id="dropBox"
    ondrop="drop(event)"
    ondragover="allowDrop(event)">
  </div>
  <br>
  <!-- 可拖拽元素 -->
  <div
    id="dragBox"
    draggable="true"
    ondragstart="drag(event)">
    可以把我拖到矩形框中
  </div>

  <script>
    function allowDrop(ev) {
      ev.preventDefault();
    }
    function drag(ev) {
      ev.dataTransfer.setData("Text", ev.target.id);

    }
    function drop(ev) {
      ev.preventDefault();
      const data = ev.dataTransfer.getData("Text");
      ev.target.appendChild(document.getElementById(data));
    }
  </script>

上面示例代码展示了一个最基本的拖拽操作。

放置元素涉及到的事件

dragenter 事件

dragenter:当拖拽元素或选中的文本到一个可释放目标时触发。

dragleave 事件

dragleave:当拖拽元素或选中的文本离开一个可释放目标时触发。

dragleave事件不可取消。

上面dragenter的示例中,演示了在dragleave事件触发时取消样式的用法。

dragover 事件

dragover:当元素或选中的文本被拖到一个可释放目标上时触发(每几百ms触发一次)。

dragover在放置元素上触发。

drop 事件

drop:当元素或选中的文本在可释放目标上被释放时触发。

执行放置

当用户放开鼠标,拖放操作就会结束。如果在有效的放置目标元素上放开鼠标,即可放置成功。drop事件就会在目标元素上被触发。拖拽取消,不会触发drop事件。

在与拖拽有关的事件中,事件的dataTransfer属性一直存储着拖拽数据,我们使用getData()方法来获取数据。

function drop(ev) {
    ev.preventDefault();
    const data = ev.dataTransfer.getData("Text");
}

getData()方法接收一个参数,取回数据的类型。(即使用setData()方法设置的字符串值,如果不存在对应的数据类型数据,返回空字符串哦)

拖放demo

拖放基础demo:

👉 在线查看demo完整代码和效果请点击这里

dragenter事件触发时修改放置元素的样式;

dragleave事件触发时清空放置元素的样式;

drop放置事件触发时清空放置元素的样式,将拖拽元素添加到放置区域;

GIF 2023-7-23 9-09-45.gif
  <!-- 可放置元素 -->
  <div
    id="dropBox"
    ondrop="drop(event)"
    ondragenter="dragenter(event)"
    ondragleave="dragleave(event)"
    ondragover="allowDrop(event)">
  </div>
  <br>
  <!-- 可拖拽元素 -->
  <div
    id="dragBox"
    draggable="true"
    ondragstart="drag(event)">
    可以把我拖到矩形框中
  </div>

  <script>
    function allowDrop(ev) {
      ev.preventDefault();
    }
    function drag(ev) {
      ev.dataTransfer.setData("Text", ev.target.id);
    }
    function drop(ev) {
      ev.preventDefault();
      const data = ev.dataTransfer.getData("Text");
      ev.target.appendChild(document.getElementById(data));
      ev.target.style.backgroundColor = "";
    }
    function dragenter(ev) {
      ev.target.style.backgroundColor = "yellow";
    }
    function dragleave(ev) {
      ev.target.style.backgroundColor = "";
    }
  </script>

拖放进阶demo

👉 在线查看demo完整代码和效果请点击这里

GIF 2023-7-23 10-51-35.gif

拖放总结

总结一下整个拖放操作中会涉及到的属性、对象和事件等。

draggable属性

属性名 描述
draggable 用来标识元素是否可拖拽,是枚举类型属性

拖放涉及事件

对象 事件名 事件描述
可拖拽元素 drag 在拖动元素或选中文本时触发(每隔几百ms触发一次)
可拖拽元素 dragstart 在开始拖动元素或选中文本时触发
可拖拽元素 dragend 在拖放操作结束时触发(释放鼠标按钮或单击 esc键时)
放置元素 dragenter 在可拖拽元素或者被选中文本进入放置元素时触发
放置元素 dragleave 在可拖拽元素或选中文本离开放置元素时被触发
放置元素 dragover 在可拖拽元素或者选中文本被拖进一个放置元素时(每隔几百ms触发一次)
放置元素 drop 在元素或选中文本被放置在有效的放置元上时被触发

DataTransfer对象

DataTransfer的方法

方法名 描述
setData() 设置指定类型的数据。如果类型数据不存在,则将其添加到末尾,使其在类型列表中的最后一项是新的格式。如果该类型数据已经存在,则在相同位置替换现有数据
getData() 获取指定类型的数据,如果类型数据不存在,则返回空字符串
clearData() 删除给定类型的数据。类型参数可选。若类型为空或未指定,则删除所有类型的数据
setDragImage() 设置自定义的拖动图像

DataTransfer的属性

属性名 描述
types 只读,提供dragstart事件中设置的格式的strings数组
items 只读,包含所有拖动数据列表的DataTransferItemList对象
files 包含数据传输中可用的本地文件列表,如果未拖动文件,值为空列表
dropEffect 获取当前选定的拖放操作类型或者设置的为一个新的类型。值必须为 none, copy, linkmove
effectAllowed 提供所有可用的操作类型。必须是 none, copy, copyLink, copyMove, link, linkMove, move, all 或者 uninitialized 之一

更多拖拽相关的内容,如果还有没涉及到的,评论区可以一起讨论哦。

❤️ 🧡 💛大家喜欢我写的文章的话,欢迎大家点点关注、点赞、收藏和转载!!
🔥我会持续更新前端相关的内容文章哦

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容