公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

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

【JavaScript】純JS實(shí)現(xiàn)文件拖拽上傳功能

admin
2023年10月30日 11:9 本文熱度 1340

導(dǎo)讀

文件拖拽上傳功能現(xiàn)在已經(jīng)隨處可見,大家應(yīng)該都用過(guò)了吧,那么它具體是怎么實(shí)現(xiàn)的大家有去了解過(guò)嗎?今天我們一起來(lái)實(shí)現(xiàn)一下這個(gè)功能,并封裝一個(gè)拖拽上傳組件吧。


效果展示

image.png

體驗(yàn)地址:http://jyeontu.xyz/jvuewheel/#/JDragUploadView

功能實(shí)現(xiàn)

原生JavaScrip實(shí)現(xiàn)

首先我們應(yīng)該先將頁(yè)面寫好:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>點(diǎn)擊或拖拽上傳并顯示圖片</title>
    <style>
      body {
        display: flex;
        flex-direction: column;
      }
      h1 {
        text-align: center;
      }
      #drop-zone {
        width300px;
        height200px;
        border2px dashed #ccc;
        margin20px auto;
        text-align: center;
        line-height200px;
        font-size18px;
      }
      #uploaded-image {
        max-width300px;
        max-height300px;
        margin20px auto;
      }
    
</style>
  </head>
  <body>
    <h1>點(diǎn)擊或拖拽上傳并顯示圖片示例</h1>
    <div id="drop-zone">點(diǎn)擊或拖拽上傳圖片</div>
    <img id="uploaded-image" src="" alt="上傳的圖片" />
    <script>
    </script>
  </body>
</html>

image.png

我們?cè)囅轮苯油献D片到頁(yè)面上是什么效果

AI改圖-2023-09-23-21-43-40-720x405.gif

我們發(fā)現(xiàn)直接將圖片拖拽到頁(yè)面上會(huì)在新頁(yè)面打開圖片,那么我們需要阻止這一個(gè)默認(rèn)行為以允許放置,頁(yè)面的拖拽行為主要會(huì)觸發(fā)以下幾個(gè)事件:

dragenter

dragenter 事件在可拖動(dòng)的元素或者被選擇的文本進(jìn)入一個(gè)有效的放置目標(biāo)時(shí)觸發(fā)。

目標(biāo)對(duì)象是用戶直接選擇的范圍(由用戶直接指示作為放置目標(biāo)的元素),或者 <body> 元素。

dragleave

dragleave 事件在拖動(dòng)的元素或選中的文本離開一個(gè)有效的放置目標(biāo)時(shí)被觸發(fā)。

此事件不可取消。

dragover

dragover 事件在可拖動(dòng)的元素或者被選擇的文本被拖進(jìn)一個(gè)有效的放置目標(biāo)時(shí)(每幾百毫秒)觸發(fā)。

該事件在放置目標(biāo)上觸發(fā)。

drop

drag 事件在用戶拖動(dòng)元素或選擇的文本時(shí),每隔幾百毫秒就會(huì)被觸發(fā)一次。

效果實(shí)現(xiàn)

獲取上傳框和預(yù)覽框元素
const dropZone = document.getElementById("drop-zone");
const uploadedImage = document.getElementById("uploaded-image");
圖片進(jìn)入上傳框時(shí),為上傳框加一層灰色蒙層

監(jiān)聽上傳框的dragenter事件,在圖片移動(dòng)進(jìn)入上傳框時(shí)改變上傳框的背景顏色。

dropZone.addEventListener("dragenter"function (event{
    dropZone.style.backgroundColor = "#f7f7f7";
});
圖片離開上傳框時(shí),去除上傳框的灰色蒙層

監(jiān)聽上傳框的dragleave事件,在圖片移出上傳框時(shí)去除上傳框的背景顏色。

dropZone.addEventListener("dragleave"function (event{
    dropZone.style.backgroundColor = "";
});
阻止瀏覽器默認(rèn)行為,例如打開文件

dragoverdrop事件都會(huì)觸發(fā)瀏覽器打開文件,我們需要阻止其默認(rèn)行為。

dropZone.addEventListener("dragover"function (event{
    event.preventDefault();
});
dropZone.addEventListener("drop"function (event{
    event.preventDefault();
});
獲取拖拽上傳的文件

拖拽釋放會(huì)觸發(fā)drop事件,我們只需要監(jiān)聽drop事件,獲取到拖拽的文件列表event.dataTransfer.files即可。

dropZone.addEventListener("drop"function (event{
    event.preventDefault();
    dropZone.style.backgroundColor = "";
    const file = event.dataTransfer.files[0];
    handleFile(file);
});
處理上傳文件,為圖片時(shí)設(shè)置預(yù)覽圖

判斷上傳的文件是否為圖片,我們只需要判斷上傳文件的type是否為image開頭,是的話我們可以將其轉(zhuǎn)為dataUrl文件并設(shè)置預(yù)覽。

  function handleFile(file{
    if (file && file.type.startsWith("image/")) {
      const reader = new FileReader();
      reader.onload = function (event{
        uploadedImage.src = event.target.result;
      };
      reader.readAsDataURL(file);
    }
  }

封裝為vue組件

知道了原生js實(shí)現(xiàn)一個(gè)拖拽上傳功能之后,我們也能很容易得將其封裝成一個(gè)vue組件。

監(jiān)聽拖拽事件

在vue中,我們直接通過(guò)@dragover、@dragleave@drop即可監(jiān)聽元素的拖拽事件。

<div
    class="upload-area"
    @dragover.prevent="handleDragOver"
    @dragleave="handleDragLeave"
    @drop.prevent="handledrop"
    @click="handleUploadClick"
>

    <p v-if="!isDragging" class="tip-text">{{ tipText }}</p>
    <p v-else>{{ tipConfirmText }}</p>
</div>

事件的處理邏輯和原生js其實(shí)都是一樣的。

methods: {
    handleDragOver(event) {
        event.preventDefault();
        this.isDragging = true;
    },
    handleDragLeave() {
        this.isDragging = false;
    },
    handledrop(event) {
        event.preventDefault();
        this.isDragging = false;
        const file = event.dataTransfer.files[0];
        this.uploadFile(file);
    }
}

獲取到上傳文件并傳遞給父組件

獲取到上傳的文件后,我們不應(yīng)該組件內(nèi)直接處理文件了,將其傳遞給父組件進(jìn)行處理即可。

uploadFile(file) {
    this.$emit("uploadFile", file);
}

組件完整代碼

功能邏輯與原生JavaScrip基本相同,這里也不重復(fù)描述了,直接看代碼吧:

<template>
    <div class="drag-upload">
        <div
            class="upload-area"
            @dragover.prevent="handleDragOver"
            @dragleave="handleDragLeave"
            @drop.prevent="handledrop"
            @click="handleUploadClick"
        >

            <p v-if="!isDragging" class="tip-text">{{ tipText }}</p>
            <p v-else>{{ tipConfirmText }}</p>
        </div>
        <input
            type="file"
            ref="fileInput"
            style="display: none"
            @change="handleFileselected"
        />

    </div>

</template>

<script>
export default {
    name: "JDragUpload",
    props: {
        tipText: {
            type: String,
            default: "將文件拖放到此處或點(diǎn)擊上傳",
        },
        tipConfirmText: {
            type: String,
            default: "釋放文件以上傳",
        },
    },
    data() {
        return {
            isDragging: false,
        };
    },
    methods: {
        handleDragOver(event) {
            event.preventDefault();
            this.isDragging = true;
        },
        handleDragLeave() {
            this.isDragging = false;
        },
        handledrop(event) {
            event.preventDefault();
            this.isDragging = false;
            const file = event.dataTransfer.files[0];
            this.uploadFile(file);
        },
        handleUploadClick() {
            this.$refs.fileInput.click();
        },
        handleFileselected() {
            const file = this.$refs.fileInput.files[0];
            this.uploadFile(file);
        },
        uploadFile(file) {
            this.$emit("uploadFile", file);
        },
    },
};
</
script>

<style lang="less" scoped>
.drag-upload {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    width: 100%;
    border: 2px dashed #ccc;
    .upload-area {
        display: flex;
        align-items: center;
        justify-content: center;
        height: 100%;
        width: 100%;
        background-color: #f0f0f0;
        cursor: pointer;
        .tip-text {
            text-align: center;
        }
    }
}
</style>

image.png

源碼

組件體驗(yàn)及文檔地址:http://jyeontu.xyz/jvuewheel/#/JDragUploadView

Gitee源碼:https://gitee.com/zheng_yongtao/jyeontu-component-warehouse/tree/master/JYeontuComponentWarehouse/packages/JDragUpload


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

主站蜘蛛池模板: 国产高清专区免费资源网站 | 国产成人无码午夜视频在线观 | 国产精品一一在线观看 | 国产精品无码一区二区在线看 | 国产黄又粗遮挡免费视频 | 91在线播放国产日本欧美 | 国产美女脱的黄的全 | 丰满人妻一区二区三区四季av | 高清不卡av一区二区 | 韩国免费理论片在线观看 | 国产成人综合日韩精品无码 | 国产丝袜91 | 国产无套流白浆视频免费 | 国产成年女人特黄 | 成人动漫免费看一区二区三区 | 国产综合精品91久久久 | 精品撒尿视频一区二区三区 | 极品粉嫩国产18尤物在线观看 | 国产在线97公开视频 | 国产精品国产三级国产aⅴ9色 | 国产午夜场免费视频在线播放 | 国产成人无码精品久久久小说 | 国产精品国产精品国产专区 | 成人日韩一区在线 | 国产偷录叫床高潮录音 | 国产精品人人妻人人狠 | 国产免费高清白丝在线观看 | 国产ts无码 | 国产精品成人竹菊影视亚洲一级黄 | 91精品观看91久久久久 | 国产午夜无码片在线观看影院 | 操美女国产 | 国产成人免费大电影 | 国产美女亚洲精品久久久毛片 | 国产午夜免费啪 | 成人区精品一区二区毛片不卡 | 国产片婬乱一级毛片丫丫 | 国产成人无码aⅴ片在线观看不卡 | 国自产拍偷拍精品啪啪一区二 | 国产成人午夜精品免费视频 | 成人av黄色网站 |