0

0

如何用javascript实现拖放功能【教程】

夜晨

夜晨

发布时间:2026-01-28 14:39:09

|

790人浏览过

|

来源于php中文网

原创

原生拖放API中drop不触发的根本原因是浏览器默认阻止dragover事件,必须在dragover中调用event.preventDefault();dataTransfer仅支持字符串,推荐用ID查表还原数据;非draggable元素需手动设置draggable="true";移动端需touch事件模拟。

如何用javascript实现拖放功能【教程】

原生 JavaScript 的拖放(Drag and Drop)API 表面简单,实际容易卡在 dragover 事件被忽略、drop 不触发、或数据传不进目标元素上——根本原因不是写法错,而是浏览器默认阻止了这些事件的默认行为。

为什么 drop 事件完全不触发?

因为浏览器对 dragenterdragover 默认不做任何事,更不会让 drop 发生。你必须显式调用 event.preventDefault(),而且得在 dragover(以及可选的 dragenter)里调用。

  • dragover 是唯一必须阻止默认行为的事件;漏掉它,drop 永远不会触发
  • dragenter 阻止与否不影响 drop,但能控制“进入目标区域”的视觉反馈(比如加 class)
  • 不能只在 droppreventDefault()——太晚了,浏览器已经跳转或下载了

dataTransfer 只能传字符串?怎么传 DOM 元素或对象?

dataTransfersetData() 方法只接受字符串类型值,但你可以用它传递标识符(如 ID 或索引),再在 drop 时查表还原真实数据。

  • 不要尝试 setData('text/plain', JSON.stringify(obj)) 后在 dropJSON.parse() ——跨域或安全策略可能拦截
  • 推荐做法:拖拽开始前把源元素的引用缓存在全局 Map 或数组中,setData('text/id', 'item-123')drop 时用该 ID 查找对应数据
  • 如果只是移动 DOM 节点,直接 event.target.appendChild(draggedElement) 更可靠,无需走 dataTransfer

如何让非 draggable="true" 元素可拖?

只有设置了 draggable="true" 的元素(或表单控件、图片等原生可拖元素)才能触发拖拽起点。但你可以用 JS 主动触发:

新快购物系统
新快购物系统

新快购物系统是集合目前网络所有购物系统为参考而开发,不管从速度还是安全我们都努力做到最好,此版虽为免费版但是功能齐全,无任何错误,特点有:专业的、全面的电子商务解决方案,使您可以轻松实现网上销售;自助式开放性的数据平台,为您提供充满个性化的设计空间;功能全面、操作简单的远程管理系统,让您在家中也可实现正常销售管理;严谨实用的全新商品数据库,便于查询搜索您的商品。

下载

立即学习Java免费学习笔记(深入)”;

  • 监听 mousedown,然后调用 element.setPointerCapture() + element.draggable = true 动态开启(注意后续要恢复)
  • 更稳妥的做法:在目标元素上加 draggable="true",再用 CSS user-select: none 避免文字被误选
  • 移动端不支持原生 drag API,必须用 touchstart/touchmove 模拟——这点常被忽略,导致 H5 页面拖放失效

最易被绕过的细节是:拖放过程中若鼠标移出窗口(比如切到别的标签页),dragend 仍会触发,但 drop 已经没了;此时应靠 dragleave 或定时器兜底清理状态。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

287

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

258

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

124

2025.08.07

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 24.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号