中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript拖拽上傳功能如何實現

發布時間:2020-10-16 15:54:42 來源:億速云 閱讀:139 作者:小新 欄目:web開發

這篇文章主要介紹JavaScript拖拽上傳功能如何實現,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

最近,小明遇到這樣一種情況:在網頁中上傳文件時偶爾頁面會崩潰。小明仔細測試了這種情況,發現之前用的一個文件上傳組件有一點缺陷,于是,小明決定自己手寫一個,樣式如下:

JavaScript拖拽上傳功能如何實現

JavaScript拖拽上傳功能如何實現

圖一是沒有上傳文件時的樣式,圖二為上傳文件后的樣式。虛線部分為放置區域,先來看代碼:

html部分

<div id="app">
    <div class="content">
      <div class="drag-area" @dragover="fileDragover" @drop="fileDrop">
        <div v-if="fileName" class="file-name">{{ fileName }}</div>
        <div v-else class="uploader-tips">
          <span>將文件拖拽至此,或</span>
          <label for="fileInput" style="color: #11A8FF; cursor: pointer">點此上傳</label>
        </div>
      </div>
    </div>

    <div class="footer">
      <input type="file" id="fileInput" @change="chooseUploadFile" style="display: none;">
      <label for="fileInput" v-if="fileName" style="color: #11A8FF; cursor: pointer">選擇文件</label>

      <button @click="uploadOk">提交</button>
    </div>
  </div>

css部分

    * {
      font-size: 14px;
    }
    .drag-area {
      height: 200px;
      width: 300px;
      border: dashed 1px gray;
      margin-bottom: 10px;
      color: #777;
    }
    .uploader-tips {
      text-align: center;
      height: 200px;
      line-height: 200px;
    }
    .file-name {
      text-align: center;
      height: 200px;
      line-height: 200px;
    }

js部分

    new Vue({
      el: '#app',
      data () {
        return {
          fileName: '',
          batchFile: '',
          MAX_FILE_SIZE: 10 * 1000 * 1000
        }
      },
      methods: {
        // 點擊上傳
        chooseUploadFile (e) {
          const file = e.target.files.item(0)

          if (!file) return
          if (file.size > this.MAX_FILE_SIZE) {
            return alert('文件大小不能超過10M')
          }

          this.batchFile = file
          this.fileName = file.name

          // 清空,防止上傳后再上傳沒有反應
          e.target.value = ''
        },
        // 拖拽上傳
        fileDragover (e) {
          e.preventDefault()
        },
        fileDrop (e) {
          e.preventDefault()
          const file = e.dataTransfer.files[0] // 獲取到第一個上傳的文件對象

          if (!file) return
          if (file.size > this.MAX_FILE_SIZE) {
            return alert('文件大小不能超過10M')
          }

          this.batchFile = file
          this.fileName = file.name
        },
        // 提交
        uploadOk () {
          if (this.batchFile === '') {
            return alert('請選擇要上傳的文件')
          }

          let data = new FormData()
          data.append('upfile', this.batchFile)

          // ajax
        }
      }
    })

核心原理說明

  • dragover和drop事件

第一個要說的就是拖拽中的這兩個事件,因為這兩個事件撐起了拖拽上傳的核心功能。
對于拖拽這個動作而言,有二個核心概念,一個是拖拽元素,還一個是放置目標。這里,我只講放置目標上的事件,對于拖拽元素的事件,請自行查閱。

那對于放置目標,它有什么事件呢?如下:
當某個元素被拖動到一個有效的放置目標上(如上例中虛線區域)時,下列事件會依次發生:
(1) dragenter
(2) dragover
(3) dragleave 或 drop
只要有元素被拖動到放置目標上,就會觸發 dragenter 事件(類似于 mouseover 事件)。緊隨其后的是 dragover 事件,而且在被拖動的元素還在放置目標的范圍內移動時,就會持續觸發該事件。如果元素被拖出了放置目標,dragover 事件不再發生,但會觸發 dragleave 事件(類似于 mouseout事件)。如果元素被放到了放置目標中,則會觸發 drop 事件而不是 dragleave 事件。

對于本例來說,我們只需要關注dragover和drop事件。但是drop事件卻有點調皮,你想監聽它,還得進行一些處理,因為默認情況下,元素是不允許放置的,在拖動元素經過某些無效放置目標時,可以看到一種特殊的光標(圓環中有一條反斜線),表示不能放置。如下:

JavaScript拖拽上傳功能如何實現

如果拖動元素經過不允許放置的元素,那無論用戶如何操作,都不會發生 drop 事件。那怎么辦呢?
我們可以重寫 dragover 事件的默認行為,如上例代碼中的e.preventDefault()。
細心的同學可能要問了,那drop事件中也有e.preventDefault(),去掉行不行呢?大家可以自行試下。

  • dataTransfer 對象

可能這個對象看著有些陌生,但是它的作用可不小。比如,你拖動一個圖片到目標區域,那目標區域怎么獲取這個圖片的信息呢?就靠它!它是事件對象的一個屬性,用于從被拖動元素向放置目標傳遞字符串格式的數據。在本例中,我們可以通過它來獲取拖動中的文件信息。

  • input的change事件

這個事件其實有坑的,它有這樣一個特性,即:上傳同一個文件,并不會觸發change事件,即使該文件內容做過修改。
細思極恐!比如,用戶要上傳一個文檔,但是拖拽到虛線區域后發現文檔內容還需要修改下,他改完后再拖拽該文檔,再提交到服務器,那么他上傳到服務器的文檔內容卻是未修改之前的!
所以,我們需要代碼e.target.value = ''來進行重置處理,這樣,每次上傳文件都會觸發change事件。

以上是JavaScript拖拽上傳功能如何實現的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴仁县| 延川县| 伊宁市| 和平县| 汉沽区| 嘉定区| 呼玛县| 徐水县| 商南县| 顺昌县| 海晏县| 泰宁县| 策勒县| 赣榆县| 萨嘎县| 葫芦岛市| 游戏| 永修县| 镇巴县| 卢龙县| 永定县| 公安县| 万宁市| 富平县| 龙南县| 洛阳市| 滨州市| 桑植县| 应城市| 衡山县| 威海市| 镇赉县| 三台县| 苍山县| 搜索| 泽库县| 万载县| 辽中县| 昌都县| 越西县| 砀山县|