首页 > 教程 > 关键词  > 浏览器最新资讯  > 正文

浅谈浏览器的原生拖拽事件

2013-12-16 16:03 · 稿源: 雨夜带刀’s Blog

虽然之前有写过模拟浏览器拖拽行为的组件,但这种拖拽限制于改变 DOM 元素的位置,只是 UI 层面的交互效果。最近在做的拖拽上传文件,拖拽时需要和服务端进行数据层面的交互,此时就需要用到浏览器原生的拖拽事件。

在高档浏览器中,DOM 元素都有一个 draggable 属性,用于标记其是否可以在浏览器中拖拽,常见的 a 、img 元素的 draggable 默认值为 true,浏览器默认其是可以拖拽的,而其他的布局元素如 div、p 这些默认并不支持拖拽,所以值是 false,如果想让其可以拖动,需要先将其设置成 true。

再来看看原生的拖拽相关的事件类型:

  • drag : 元素被拖拽时由拖拽元素频繁触发的事件(每隔几百毫秒就会触发一次)
  • dragstart : 拖拽时开始时由拖拽元素触发的事件
  • dragend : 拖拽结束时触发由拖拽元素的事件
  • dragover : 当拖拽元素进入放置区域时由放置元素频繁触发的事件(每隔几百毫秒就会触发一次)
  • dragenter : 当拖拽元素进入放置区域时由放置元素触发的事件
  • dragleave : 当拖拽元素离开放置区域时由放置元素触发的事件
  • drop : 当拖拽元素在放置区域放置时由放置元素触发的事件

将一个文件拖拽并放置到浏览器中,浏览器默认会触发 drop 事件,为了阻止浏览器默认的放置事件,需要在 dragover 和 drop 事件中进行阻止。

在 IE10 以下的浏览器中,并不是完全不支持,只是支持程度有限,没有可玩性,这里就不多说了。

在高档浏览器中拖拽事件接口的对象中都有一个高档对象 dataTransfer,拖拽的数据就保存在这个对象中,正因为拖拽时能传递数据才有了可玩性,可见该对象的重要程度。HTML5 中关于拖拽相关的高档功能都是通过该对象来实现的。

常见的拖拽上传需要从系统向浏览器拖进一个文件,该文件就保存在 dataTransfer 中,在放置的时候就可以通过该对象来读取文件,代码如下:

01 document.addEventListener( 'dragover', function( e ){
02 // 阻止默认事件的触发
03 e.preventDefault();
04 }, false );
05
06 document.addEventListener( 'drop', function( e ){
07 var dt = e.dataTransfer,
08 item, reader;
09
10 // 阻止默认事件的触发
11 e.preventDefault();
12
13 if( dt && dt.files ){
14 item = dt.files[0];
15
16 // 通过使用FileReader构造器来读取该文件
17 reader = new FileReader();
18
19 // 读取文件后将base64的数据传递给隐藏的输入框并做提交
20 reader.onload = function( e ){
21 // e.target.result 中就包含了读取到的文件信息
22 };
23
24 // 读取文件
25 reader.readAsDataURL( item );
26 }
27 }, false );

上面是从系统向浏览器拖入文件的处理方法,那么对于页面中本身存在的元素,该如何处理呢?

HTML5 的 dataTransfer 对象在各高档浏览器中的表现还是有所差异的,比如对于直接拖拽页面中的图片然后读取图片信息,有些浏览器并不支持,或者是太麻烦,我就没去做尝试了,如果有深究过的可以告诉我。

在页面中的图片,本身都有一个 URL,在开始拖拽的时候将拖拽的数据设置成图片的 URL,然后在放置的时候读取这个 URL,最后将这个 URL 提交给服务端,让服务端去下载该图即可。

在拖拽开始时使用 setData 方法设置拖拽数据为图片的 URL:

1 <img src="https://example.com/test.jpg" alt="" id="testImg" />
01 var testImg = document.getElementById( 'testImg' );
02
03 testImg.addEventListener( 'dragstart', function( e ){
04 var dt = e.dataTransfer;
05
06 if( dt ){
07 // 将图片的URL设置成拖拽数据的文本类型
08 dt.setData( 'text', this.src );
09 }
10 }, false );

在放置的时候使用 getData 方法来获取数据:

01 document.addEventListener( 'drop', function( e ){
02 var dt = e.dataTransfer,
03 src;
04
05 if( dt ){
06 src = dt.getData( 'text' );
07
08 // 将 URL 提交给服务端
09 }
10 }, false );

如果 img 标签包含在 a 标签中,想让这些图片元素也支持拖拽传递图片 URL,需要给 a 元素绑定 dragstart 事件,然后使用 setData 方法将图片的 URL 存储进去。因为 a 元素默认拖拽的时候传递的是其自身的链接。

高档浏览器在使用 setData、getData 方法在设置和读取拖拽的数据类型时都支持好几种数据格式,常见的如 text/plain,而唯独 IE10 只支持 text 格式,为了兼容性,没有特殊情况的话还是得老老实实设置成 text 格式。

有了 setData、getData 方法,就可以在拖拽和放置时很方便的传递数据,高档浏览器支持的类型更多,有更多的可能。

如需转载请以链接形式注明原载或原文地址。

举报

  • 相关推荐
  • AI时代,浏览器的排位赛重新开启

    过去一周,WAIC 带给我们的感官刺激,已经从过去的大模型参数彻底走向AI应用革命。 但是我们所感知到的可能只是庞杂的碎片,如果梳理互联网大厂当下AI 叙事的重点,集体所向,还要从别处寻找答案。 比如,对于信息入口的定义,对于全新AI 交互形态的探索,路线其实越来越明朗。 当 OpenAI 宣布代号为「Aura」的AI浏览器进入开发阶段时,科技圈再次意识到:这场由大模型�

  • 全网超150亿次浏览,谁在做那艺娜的“抽象生意”?

    ​58岁的那艺娜,迎来了属于她的“抽象时代”。 今年五月起,她携《爱如火》进击LiveHouse,场场“售如罄”的捷报堆起话题和流量。 首场演唱会伴奏中传来童音,假唱舞台被喊“退票”。没成想后来“退票”成了粉丝的应援词,娜姐的节拍器,在多次尴尬抢拍后,那艺娜发现观众喊8声退票就能稳稳开场。 商业带货上,她同样生猛。7月中旬,那艺娜为好望水站台,一首《�

  • 迅雷浏览器2.0全新上线:极致简约 无推送、无资讯、无打扰

    迅雷浏览器2.0现已全新上线,此次升级以极简,快”为核心理念,从搜索、播放、阅读到存储等多个关键场景进行全方位重塑。 界面设计剥离冗余元素,仅保留核心功能按钮,实现 无推送、无资讯、无打扰”的纯净体验。 在搜索场景中,浏览器内置必应、360、百度、搜狗、夸克等主流搜索引擎,输入关键词即可秒获结果,同时支持自定义添加引擎,精准适配个人搜索习惯。

  • AI原生游戏与跨境算力布局,游族网络在WAIC 2025展现新蓝图

    2025世界人工智能大会(WAIC)上,游族网络展示了其向"AI驱动型互动娱乐科技公司"转型的战略布局。公司首次公开正在研发的《三体》正版IP游戏《我的三体:2277》,将其定义为"AI原生游戏",强调AI不仅是研发工具,更是玩家参与内容创作的重要元素。此外,游族网络通过与曦智科技、长城科技等企业达成算力安全合作,构建"国产算力+密态安全+场景创新"三位一体的自主可控算力安全底座。公司还当选上海人工智能行业协会副会长单位,并入选"语料风云榜"转型典范TOP10,展现其在AI技术标准制定和跨行业资源整合方面的布局。

  • 镜子里的“灰色滤镜”:润致缇透如何让皮肤透出原生光

    文章探讨了现代年轻人面临的皮肤暗沉问题,指出单纯依靠表层护肤品难以持久改善肤质。作者以植物生长为喻,强调真皮层细胞健康才是皮肤透亮的关键。润致紫光精华通过"细胞级"抗衰逻辑,采用非交联透明质酸钠修复水合屏障,配合4种氨基酸促进胶原合成,提升细胞代谢效率,形成"改善环境-新生营养-加速代谢"的闭环系统。其独特配方能深入真皮层,从根源改善细胞微环境,帮助排出老废角质和黑色素,让皮肤由内而外恢复自然光泽,实现真正的"素颜美"。

  • “大圣同款”泳衣卖爆了 国潮元素引领消费新风尚

    近日,一款设计灵感源自齐天大圣孙悟空的泳衣在网络上迅速蹿红,成为众多网友热议的焦点。这款泳衣以其独特的造型和鲜明的色彩搭配,成功吸引了大量消费者的目光,多个购物平台上的商家纷纷推出类似款式,销售情况异常火爆。 据网友分享的图片和反馈,这款泳衣在设计上高度模仿了孙悟空的经典外衣,无论是颜色还是款式都颇具神韵,让人一眼便能联想到那位桀骜

  • 彻底没了!微软开始移除Win11/10 IE浏览器元素

    在今年2月,微软正式终止了对IE11浏览器的支持,但仍有部分元素残留在系统中。微软发布博文,公布了一系列禁用IE浏览器的后续操作。从目前的情况来看,即便移除了所有相关的视觉元素,但IE浏览器的内核也会依旧存在与Windows系统中,为部分系统应用提供基础支持。

  • 以QQ浏览器为例:如何去挑选一个优质的浏览器

    随着网络技术的进步和发展,越来越多的平台都可以帮我们了解这个世界。很多用户习惯性用浏览器去看世界,查资料,那我们应该如何选择一个优质的浏览器呢?以QQ浏览器为例,为大家分析一个好的浏览器需要展现哪些特性?稳定性强大部分用户在浏览器中的逗留时间较长,因此许多用户对于浏览器最大的要求就是希望他能保持良好的网络连接速度。QQ浏览器从正式发布以来就凭借着较高的连接速度和稳定性,受到了广大用户的好评。为了确保用户

  • 手机QQ浏览器,一款老少皆宜的浏览器产品|QQ浏览器

    最近测评了很多浏览器,一直在找一款使用方便,广告少的浏览器。在综合比较之后发现,QQ浏览器可以说是市面上最好用的浏览器产品之一。尤其是手机QQ浏览器,没有广告界面,简洁明了便于使用。其实测评浏览器主要是因为不久前在朋友圈看到了一段视频,讲述的是老人不知道如何使用浏览器。虽然视频没有讲清楚前因后果,但现在有很多老人确实不会使用一些过于“智能”的APP。在这个过度追求智能的时代,为了吸引用户很多品牌将产品设?

  • Chrome浏览器下载器大变样:首次支持文件拖拽

    Chrome的下载器又加入了一项新改动,首次迎来了文件拖拽功能...在Chrome最新的Canary版本中,下载器将允许用户将下载文件直接拖放到面板之外,这一设计为用户带来了更多的可能性...一方面,用户可以直接将下载的图片、文本等文件拖放到Chrome上,从而更为便捷的进行浏览;另一方面,用户也能够直接将文件拖到桌面,而不需要在文件夹里翻上半天...需要注意的是,在此之前,Edge的下载器已经全面支持了文件拖拽功能,也就是说,和Chrome目前弹出式的下载器一样,拖拽功能同样不是谷歌首创......

热文

  • 3 天
  • 7天