一文搞懂drag&drop浏览器拖放功能的实现

这篇具有很好参考价值的文章主要介绍了一文搞懂drag&drop浏览器拖放功能的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       拖放功能,即将一个元素从一个区域,通过拖拽,放置到另一个区域。常见的应用是将文件或图片从一个区域,拖放到另一个区域。中文常常把这表述成拖拽,实际上拖拽的描述并不准确,应该叫拖放,因为drag事件和drop事件是成对使用的,即拖拽和放置。

       drag在拖拽动作发生时触发,携带被拖拽元素的信息,drop在放置元素时触发,接收传递的拖拽元素的信息。

       由于常常表述成拖拽,所以有些人在实现拖动功能时以为会触发drag事件,比如侧边栏拖拽。实际上drag是为拖放功能设计的(要配合drop),拖动(or拖拽)的功能应该用mousemove事件去实现,用错事件就会觉得怎么拖拽功能好难啊。

P.S.

drag和mousemove事件都是在移动鼠标的过程中触发,所以两个事件是会冲突的,如果发现其中一个事件不生效,可以检查下是不是因为有元素绑定了其中一个事件,导致另一个事件没有trigger。

具体实现

       拖放,拖拽和放置,那么自然需要一个拖拽的区域,和一个放置的区域。

       首先,要定义允许拖拽的元素。浏览器的默认行为是,文本、图像和链接是允许拖拽的。即<p>、<img>、<a>标签是默认允许拖拽的,其他元素要允许拖拽,则要设置draggle="true"。这个属性不允许简写。<div draggable ></div>并不会生效。

  其次,要定义拖拽的数据。比如,拖拽的是文本,则设置成文本格式,并设置拖拽的数据内容。拖拽的是图片,则设置成图片格式,设置数据内容。定义成图片格式,那么拖拽的时候,鼠标旁边就会显示一张设置的图片。设置的拖拽数据可以有多个。

      先给拖拽的元素绑定dragstart事件,再设置dataTransfer。示例代码如下:

function dragstart_handler(ev) {
  // 添加拖拽数据
  ev.dataTransfer.setData("text/plain", ev.target.innerText);
  ev.dataTransfer.setData("text/html", ev.target.outerHTML);
  ev.dataTransfer.setData(
    "text/uri-list",
    ev.target.ownerDocument.location.href,
  );
}

       拖放相关的事件对象event中,有一个dataTranster属性,这个属性保存着拖放过程中的数据。并有一些属性和方法设置和操作这些数据。

       比较常用到的属性和方法有:

dropEffect:设置放置操作的类型,可以修改放置时鼠标的显示。比如设置成none,鼠标就会显示成禁止的样式。

effectAllowed:设置拖放过程的操作类型,同样影响鼠标的显示。

setData():设置拖放的数据。一般会在dragstart事件中用到。一个事件中,setData可以设置多个数据。但同类型的数据只能添加一项,重复添加会被最后添加的覆盖。

getData():检索获取拖放的数据。一般会在drop事件中用到。

       具体可以参考MDN文档。

       最后,就是在drop区域中放置拖拽的元素。

       一个代码示例:

function drop_handler(ev) {
  const data = ev.dataTransfer.getData("text/plain");
  ev.target.textContent = data;
}

       这样,拖放就结束了。拖放功能也完成了。

       在拖放过程中,有一些全局事件触发,可以参考下表,具体请查看MDN文档。

事件 触发时刻
drag 当拖拽元素或选中的文本时触发。
dragend 当拖拽操作结束时触发 (比如松开鼠标按键或敲“Esc”键). 
dragenter 当拖拽元素或选中的文本刚进入到一个可释放目标时触发。
dragleave 当拖拽元素或选中的文本离开一个可释放目标时触发。
dragover 当元素或选中的文本被拖到一个可释放目标上时触发(每 100 毫秒触发一次)。
dragstart 当用户开始拖拽一个元素或选中的文本时触发。
drop 当元素或选中的文本在可释放目标上被释放时触发。

一些问题

但是,这样实现拖放功能会有一些体验问题,鼠标的样式显示可能不正确。

以下是一些可能的问题:

1.禁止放置的区域没有显示禁止图标。

在区域上绑定dragover事件,设置dataTransfer.dropEffect='none'并禁止默认行为e.preventDefault()

2.禁止放置的区域可以放置。

通常默认可以放置的区域是一些输入标签,比如<input>、<textarea>。在drop事件中,禁止默认行为e.preventDefault()可以禁止放置。

3.拖拽过程和可放置区域中,鼠标显示禁止图标。

在经过或者放置的区域上,在dragover和dragenter事件中禁止默认行为e.preventDefault(),设置dataTransfernone以外的值。

4.拖拽图片时,鼠标旁边没有出现图片。

要在dragstart事件中,设置dataTransfer为图片类型才会显示一张图片。如果拖拽的不是图片,但是希望拖拽时有拖拽元素的图片效果显示,也可以设置dataTransfer为图片,设置要显示的图片效果,然后再设置其他的数据。dataTransfer.setData()方法是可以设置多个类型的数据的。

         这样拖放功能的实现基本就完善了。最后在开始拖拽和放置的时候,可能会给拖拽元素和放置区域设置一些高亮的css效果,整个拖放功能的体验就会很流畅。

 


参考:

draggable属性:draggable - HTML(超文本标记语言) | MDN (mozilla.org)

拖放API:HTML 拖放 API - Web API | MDN (mozilla.org)

DataTransfer:DataTransfer - Web API | MDN (mozilla.org)文章来源地址https://www.toymoban.com/news/detail-860229.html

到了这里,关于一文搞懂drag&drop浏览器拖放功能的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 打开谷歌浏览器远程调试功能

    谷歌浏览器远程调试功能 首先我们来启动Chrome的远程调试端口。你需要找到Chrome的安装位置,在Chrome的地址栏输入 chrome://version 就能找到Chrome的安装路径 开启远程控制命令 开启后的样子(注意要关闭其他谷歌浏览器的窗口) 记住其中的 webSocketDebuggerUrl 后面的地址。这就是我们

    2024年02月11日
    浏览(45)
  • 功能:vue:浏览器打印小票、打印参数配置

    1、要实现点击 打印小票 按钮,弹出预览弹框,点击弹框里面的 打印 ,则实现浏览器打印预览,以及浏览器打印。 2、根据对应需求可以做步骤的加减,本例多了一个本地预览。 3、环境:pc端打印、chrome浏览器、爱普生TM-T81热敏打印机、打印小票宽度79.5±0.5(mm)。 代码演示:

    2024年02月03日
    浏览(60)
  • vue实现打印浏览器页面功能(两种方法)

    1,安装 npm install vue-print-nb --save 2,引入 安装好以后在main.js文件中引入 Vue.use(Print); //注册 3,现在就可以使用了 4.如需通过链接地址打印:window.location.href = airway_bill; airway_bill为链接地址。 5.如果内容打印不全,在打印操作时点击更多设置,然后设置缩放。 插件地址:https

    2024年02月02日
    浏览(47)
  • Python使用Selenium模拟浏览器自动操作功能

    概述 在进行网站爬取数据的时候,会发现很多网站都进行了反爬虫的处理,如JS加密,Ajax加密,反Debug等方法,通过请求获取数据和页面展示的内容完全不同,这时候就用到Selenium技术,来模拟浏览器的操作,然后获取数据。本文以一个简单的小例子,简述Python搭配Tkinter和

    2024年01月17日
    浏览(66)
  • 禁止浏览器自动填充密码功能,设置自动填充背景色。

    text设置autocomplete=“off” password设置 autocomplete=“new-password” 两个一起设置,就不会自动填充了。 自动填充后,阴影颜色变为黑色。 需要设置为0,不显示阴影。 设置完后,自动填充没有阴影了。

    2024年02月16日
    浏览(38)
  • 谈谈Edge浏览器新出的分屏功能

    前言   在 2023 年三月份微软为 Microsoft Edge 浏览器的稳定版本带来了一个新功能 —— 分屏浏览 ( Split Screen ),此功能允许用户在当前页面以左右视图的形式并排打开两个标签页面,作用上类似于应用的分屏可以让浏览器同时处理两个页面,分屏的好处在于 操作简单易上手

    2024年02月03日
    浏览(40)
  • selenium调用浏览器打印功能,并保存为PDF

    在使用selenium处理浏览器功能时,无法正常检测到或无法定位到你想处理的功能。 而浏览器的启动参数可以帮我们实现很多功能。 点击查看——Chrome浏览器启动命令行参数大全 代码如下(示例): 点击查看——Chrome浏览器启动命令行参数大全

    2024年02月12日
    浏览(53)
  • H5 移动端浏览器调用微信的分享功能

    API参考:概述 | 微信开放文档  封装  .js Tips: title,desc,imgURL,根据自己需求进行配置 分享到微信聊天框的示例图

    2024年02月12日
    浏览(41)
  • #Microsoft Edge功能测评!# 关于Edge浏览器以及插件推荐

    Microsoft Edge是微软基于 Chromium 开源项目及其他开源软件开发的网页浏览器。 2015年4月30日,微软在旧金山举行的Build 2015开发者大会上宣布——Windows 10内置代号为“Project Spartan”的新浏览器被正式命名为“Microsoft Edge”,其内置于Windows 10版本中。2018年3月,微软宣布Edge登陆iP

    2024年02月09日
    浏览(78)
  • 宝藏浏览器-Microsoft Edge 还有这些你不知道的功能?

      众所周知,Edge是一个很好用的浏览器(废话),不过呢,似乎用Chrome的人更多?(可能) 那么,Edge究竟为什么那么的好用(个人观点,不喜勿喷)?接下来挨个看: 没什么杂七杂八的东西(Chrome也一样?) 别急,往下看。 (这点比chrome好,chrome的插件压根下载不了)

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包