LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【W(wǎng)EB開發(fā)】前端必看:拖拽上傳的原理其實很簡單!

admin
2025年7月27日 12:13 本文熱度 275

在日常開發(fā)中,我們經(jīng)常看到一些網(wǎng)站支持“拖拽上傳”功能,比如你打開某個文件管理后臺,可以直接把本地文件拖進頁面,它就自動上傳了。

這個體驗非常絲滑,也顯得“高級”。

但你有沒有想過:這個功能到底是怎么實現(xiàn)的?

今天我們就來一起拆解一下:JS 拖拽上傳的完整原理與實現(xiàn)方式。


?一、什么是拖拽上傳?

簡單來說,拖拽上傳 就是讓用戶可以拖動文件到瀏覽器頁面的某個區(qū)域,自動觸發(fā)上傳,而不是通過 <input type="file"> 的傳統(tǒng)點擊方式。

雖然本質(zhì)上最終還是上傳文件,但用戶交互方式變了,這就涉及到瀏覽器的一套“拖放事件機制”。


??二、核心原理拆解

想實現(xiàn)拖拽上傳,需要用到以下幾個關(guān)鍵點:

1. 拖拽事件的監(jiān)聽

瀏覽器提供了一系列拖拽相關(guān)事件:

事件名
說明
dragenter
拖進目標區(qū)域時觸發(fā)
dragover
拖動過程中持續(xù)觸發(fā)(必須阻止默認
dragleave
拖出目標區(qū)域時觸發(fā)
drop
在目標區(qū)域松開鼠標時觸發(fā)(即“放下”)

2. 阻止默認行為(非常關(guān)鍵)

瀏覽器默認會在 drop 時打開文件,所以我們必須阻止默認行為

e.preventDefault();

否則你一拖文件進頁面,頁面就直接跳轉(zhuǎn)去預覽了...

3. 從 drop 中讀取文件

當你在 drop 事件里獲取到事件對象 e 時,可以通過:

e.dataTransfer.files

來讀取用戶拖進來的文件列表。

這和傳統(tǒng) input 方式中的 input.files 是一樣的東西,只不過來源不同。


???三、完整實現(xiàn)思路(HTML + JS)

下面我們來寫個最簡版的拖拽上傳 DEMO,只用于展示流程:

<div id="drop-area" style="width: 300px; height: 200px; border: 2px dashed #ccc; text-align: center; line-height: 200px;">
  拖拽文件到這里上傳
</div>

<script>
  const dropArea = document.getElementById('drop-area');

// 拖進來:添加高亮
  dropArea.addEventListener('dragenter'(e) => {
    e.preventDefault();
    dropArea.style.borderColor = '#3eaf7c';
  });

// 拖動中:必須阻止默認,才能觸發(fā) drop
  dropArea.addEventListener('dragover'(e) => {
    e.preventDefault();
  });

// 拖出:恢復樣式
  dropArea.addEventListener('dragleave'(e) => {
    e.preventDefault();
    dropArea.style.borderColor = '#ccc';
  });

// 放下文件:讀取文件
  dropArea.addEventListener('drop'(e) => {
    e.preventDefault();
    dropArea.style.borderColor = '#ccc';

    const files = e.dataTransfer.files;

    // 遍歷文件列表
    for (let file of files) {
      console.log('文件名:', file.name);
      uploadFile(file); // 上傳邏輯
    }
  });

// 模擬上傳函數(shù)
functionuploadFile(file) {
    const formData = newFormData();
    formData.append('file', file);

    fetch('/api/upload', {
      method'POST',
      body: formData
    }).then(res => {
      if (res.ok) {
        console.log(`${file.name} 上傳成功`);
      } else {
        console.error(`${file.name} 上傳失敗`);
      }
    });
  }
</script>

?四、進階點補充

1. 拖拽區(qū)域可以是任意 DOM 元素,不一定是整個頁面。

你甚至可以讓 <textarea> 接收拖拽的文件(比如 markdown 圖片粘貼上傳)。

2. e.dataTransfer.items 可以識別是不是文件夾

for (let item of e.dataTransfer.items) {
  if (item.kind === 'file') {
    const entry = item.webkitGetAsEntry();
    if (entry.isDirectory) {
      console.log('是個文件夾');
    }
  }
}

3. 拖拽上傳配合組件庫用法(如 Vue + Element Plus)

Element Plus 的 <el-upload> 組件就內(nèi)置了 drag 模式,原理跟我們上面說的是一樣的,只是封裝好了。


??五、總結(jié)

我們回顧一下拖拽上傳的核心實現(xiàn):

  1. 1. 監(jiān)聽 dragenterdragoverdrop 等事件;
  2. 2. 阻止默認行為,避免瀏覽器打開文件;
  3. 3. 從 e.dataTransfer.files 讀取文件;
  4. 4. 手動構(gòu)造 FormData 上傳文件;
  5. 5. 增強體驗:拖拽高亮、上傳進度、錯誤提示等。

雖然概念簡單,但這就是一個非常實用的 Web 技能,做后臺系統(tǒng)、CMS、富文本編輯器、前端可視化工具時經(jīng)常會用到。

 

 

 

 

- end -


閱讀原文:原文鏈接


該文章在 2025/7/29 12:34:48 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關(guān)報表等業(yè)務管理,結(jié)合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲va久久久噜噜噜久久天堂 | 亚洲一级大片在线 | 日韩在线看精品免费视频 | 亚洲中文字幕永久在线不卡 | 欧美伊久线香蕉观新在线 | 婷婷色五月欧洲图片 |