拖拽事件

-原生拖拽事件

DragEvent上传是html5的东东,对应的几个事件有

  • drag
  • dragend
  • dragenter
  • dragexit
  • dragleave
  • dragover
  • dragstart
  • drop

其中常用的有四个:dragenter、dragover、drop、dragend 
分别对应的事件为:拖进、拖来拖去、释放鼠标、拖出

换成代码就长这样:

<span style="color:#000000"><code>document.addEventListener(<span style="color:#009900">"dragenter"</span>, <span style="color:#000088">function</span>( event ) {
    <span style="color:#000088">...</span>
}, false);
document.addEventListener(<span style="color:#009900">"dragover"</span>, <span style="color:#000088">function</span>( event ) {
    <span style="color:#000088">...</span>
}, false);
document.addEventListener(<span style="color:#009900">"drop"</span>, <span style="color:#000088">function</span>( event ) {
    event.preventDefault();//禁止浏览器默认行为
    <span style="color:#000088">...</span>
    <span style="color:#000088">return</span> false;//禁止浏览器默认行为
}, false);
document.addEventListener(<span style="color:#009900">"dragend"</span>, <span style="color:#000088">function</span>( event ) {
    <span style="color:#000088">...</span>
}, false);</code></span>
监听拖拽事件在不同场景下有不同的实现方法: ### 桌面端普通元素拖拽 在桌面端,要实现普通元素的拖拽监听,可按以下步骤进行: 1. 设置指定元素为可拖拽元素,使用 `draggable` 属性,只有设置了该属性,元素才可以被拖动。 2. 点击拖拽元素开始进行拖拽并监听拖拽开始事件,设置拖拽相关数据等。 3. 监听拖拽移动时的事件。 4. 监听拖拽元素目标元素移入目标元素事件,处理进入目标元素时的操作,如添加进入目标元素时的效果等。 5. 监听拖拽元素在目标元素上移动的事件,处理移动中的一些操作,如阻止默认事件等。 6. 在目标元素上松开拖拽元素完成拖拽,处理拖拽完成时的操作 [^1]。 ### 移动端拖拽 在移动端,不能使用鼠标事件,需要改成触摸事件,如 `onTouchStart`,然后对 `touchmove` 事件进行监听。以下是使用 `antd` 的 `Drawer` 组件实现移动端拖拽的代码示例: ```jsx import React, { useMemo, useState } from 'react'; import { Drawer } from 'antd'; const handleTouchStart = (e) => { e.preventDefault(); const handleTouchMove = (e) => { // 处理 touchmove 逻辑 }; document.addEventListener("touchmove", handleTouchMove); document.addEventListener("touchend", () => { document.removeEventListener("touchmove", handleTouchMove); }); }; const App = () => { const [open_metadata, set_open_metadata] = useState(false); const drawer_height = 200; const drawer_header = useMemo(() => { return ( <div> <div className="drag-container" onTouchStart={handleTouchStart}> <div className="drag-line"></div> </div> <div>header</div> </div> ); }, []); return ( <Drawer title={drawer_header} onClose={() => set_open_metadata(false)} open={open_metadata} placement={"bottom"} height={drawer_height} rootClassName="metadata-drawer" ></Drawer> ); }; export default App; ``` 此代码通过重写 `Drawer` 的 `title`,添加了一个可拖拽的横线,在移动端监听 `touchstart` 和 `touchmove` 事件,实现了拖拽功能 [^2]。 ### 文件拖拽上传监听 在文件拖拽上传场景中,监听拖拽事件时可能会遇到第一次拖拽得不到上传的文件内容,第二次以后才能正常得到的问题。以下是错误和正确代码示例: #### 错误代码示例 ```jsx import React from 'react'; const newFile = (e) => { const el = e.target as HTMLInputElement; console.log(el.files); if (el.files?.[0]) { // transImg.fileToUrl 假设是一个将文件转换为 URL 的函数 (transImg.fileToUrl(el.files[0]) as Promise<string>).then((res) => { console.log(res); }); } }; const App = () => { return ( <input type="file" onDrop={(e) => newFile(e)} /> ); }; export default App; ``` #### 正确代码(需根据具体问题修复逻辑) 要解决第一次拖拽得不到文件内容的问题,需要正确处理拖拽事件,可能需要阻止默认行为等操作,具体修复代码需根据实际情况完善 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值