上面的代码片段呈现了一个矩形容器,我们可以在其中粘贴文件。该容器有一个名为 contenteditable 的属性,设置为 true。 contenteditable 属性对于启用容器中的文件或任何其他项目的粘贴非常重要。如果 contenteditable 属性更改为 false 或删除,粘贴操作将无法按预期工作。我们还有一个ID为preview的容器。我们将使用预览容器来预览用户粘贴的图像。

让我们从 style.css 添加一些基本样式到我们的标记中

*{    font-family: Arial, Helvetica, sans-serif;}body{    text-align: center;    margin-block-start: 4rem;}#pasteArea {    border: 2px dashed #ccc;    padding: 20px;    width: 300px;    height: 200px;    display: flex;    align-items: center;    justify-content: center;    text-align: center;    cursor: pointer;    margin: auto;    color: rgb(5, 89, 89);}#preview img {    max-width: 100%;    margin-top: 10px;}

上面的标记和样式表创建了一个简单的破折号边框容器,其中包含简单的提示文本,如下面的屏幕截图所示:

\\\"Implementing

现在我们已经创建了 UI,让我们在下一节中使用 JavaScript 添加一些有用的功能。

剧本

在本节中,我们将使用 JavaScript 将粘贴事件侦听器添加到粘贴区域。在从 DOM 获取粘贴区域以附加事件侦听器之前,我们首先等待 DOM 内容加载,如下面的代码片段所示。

document.addEventListener(\\'DOMContentLoaded\\', () => {    const pasteArea = document.querySelector(\\'#pasteArea\\');    pasteArea.addEventListener(\\'paste\\', (event) => {    });});

在上面的代码片段中,我们添加了 DOMContentLoaded 事件的监听器。这使得我们可以等待 DOM 树创建后才能获取 DOM 元素。接下来,我们选择粘贴区域容器并向其附加粘贴事件侦听器。

从粘贴的项目中获取文件

粘贴事件处理程序在前面的代码片段中未实现。让我们通过从事件对象获取数据并将它们记录在控制台中来实现它。我们将在本文后面对数据进行更多处理,目前,我们只想确保在将项目粘贴到粘贴区域时接收到文件。下面的代码片段显示了粘贴事件处理程序的最小实现。

pasteArea.addEventListener(\\'paste\\', (event) => {        const items = event.clipboardData.items        for (const item of items) {            if (item.kind === \\'file\\') {                const file = item.getAsFile()                console.log(file)            }        }    })

在上面的代码片段中,我们从 event.clipboardData 对象获取项目。 event.clipboardData.items 是一个 DataTransferItemList,它是一个包含粘贴项目内容的类似列表的对象。这些项目存储在列表中,因为用户可以一次复制和粘贴多个项目。

接下来,我们使用 for ...of 循环迭代项目。在循环中,我们检查每个项目是否是一个文件。如果该项目是国王“文件”,我们将其作为文件获取并将其打印在浏览器的控制台上。

在控制台上打印文件信息对于网页的用户来说并不是很有用。让我们在下一节中做一些更有趣的事情。

预览上传的文件

如果我们不在任何地方显示它,那么在将项目粘贴到剪贴板后,用户将很难知道文件上传是否成功。通过显示指示成功的内容来表明文件已成功上传非常重要。还有什么比显示上传文件本身更好的指示上传成功的方法呢?

在本节中,我们将扩展粘贴事件处理程序以从接收到的文件创建 URL。文件加载到浏览器后,我们将使用创建的 URL 来呈现该文件。我们将利用 FileReader API 从文件创建 URL,如下面代码段中的代码所示。

pasteArea.addEventListener(\\'paste\\', (event) => {        const items = event.clipboardData.items        for (const item of items) {            if (item.kind === \\'file\\') {                const file = item.getAsFile()                const reader = new FileReader();                reader.onloadend = (e) => {                    const url = e.target.result                    console.log(url)                };                reader.readAsDataURL(file);            }        }    });

在上面的代码片段中,我们创建了 FileReader 的实例并使用它来生成数据 URL。我们还向 FileReader 对象附加了一个 loadend 事件侦听器,我们将读取结果记录到控制台。这是预览文件的第一步,我们现在可以使用 URL 来显示文件。

假设用户粘贴了图像文件,以下代码片段显示了我们如何扩展事件处理程序以创建 URL 并显示图像文件。

 reader.onloadend = (e) => {       const url = e.target.result       const preview = document.querySelector(\\'#preview\\')       const img = document.createElement(\\'img\\');       img.src = url;       preview.appendChild(img);   };

在上面的代码片段中,我们从 DOM 获取预览容器并创建一个 img 元素来渲染图像。我们将创建的 URL 指定为图像的 src,并将图像附加到预览容器中。将图像附加到预览容器后,用户现在可以知道他们粘贴的图像已成功加载到网页中。

成功!我们已经成功地在网页上实现了通过复制粘贴的方式上传文件。这种文件上传方式使用户能够轻松上传文件,无需点击几个按钮来选择要上传的文件。 ClipboadEvent 接口提供了一种从浏览器上粘贴的项目收集数据的简单方法。 FileReader 接口允许我们从上传的文件创建 URL 并使用它来预览上传的文件。

欢迎在评论区畅所欲言。从 MDN 查找有关 ClipBoardEvent 和 FileReader 接口的更多信息。

","image":"http://www.luping.net","datePublished":"2024-07-30T20:54:02+08:00","dateModified":"2024-07-30T20:54:02+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 在Web上實現文件複製貼上輸入

在Web上實現文件複製貼上輸入

發佈於2024-07-30
瀏覽:477

在Web开发领域,收集用户输入时有多种上传文件的方法。其中一种方法是复制粘贴。文件输入的复制粘贴是一种非常直观的用户上传文件的方法。复制粘贴文件输入方法使用户无需记住要上传的文件的位置。在本文中,我们将讨论如何在您的网站上实现通过复制粘贴的方式输入文件。

我们将利用 ClipboadEvent 和 EventTarget 接口来实现复制粘贴文件输入。 ClipboardEvent接口提供了有关粘贴事件的信息,EventTarget接口允许我们监听粘贴事件。

在侦听粘贴事件时,我们将附加一个事件处理函数,在其中决定如何处理粘贴的项目。在我们的例子中,我们将获取粘贴的文件并在其完全加载到浏览器中后立即渲染它。我们将从 HTML 和样式开始。

HTML 和样式

让我们首先创建粘贴区域的 HTML 标记。下面的代码片段是 HTML 标记:



    
    
    Copy-Paste File Input
    


    
Paste your file here

上面的代码片段呈现了一个矩形容器,我们可以在其中粘贴文件。该容器有一个名为 contenteditable 的属性,设置为 true。 contenteditable 属性对于启用容器中的文件或任何其他项目的粘贴非常重要。如果 contenteditable 属性更改为 false 或删除,粘贴操作将无法按预期工作。我们还有一个ID为preview的容器。我们将使用预览容器来预览用户粘贴的图像。

让我们从 style.css 添加一些基本样式到我们的标记中

*{
    font-family: Arial, Helvetica, sans-serif;
}

body{
    text-align: center;
    margin-block-start: 4rem;
}
#pasteArea {
    border: 2px dashed #ccc;
    padding: 20px;
    width: 300px;
    height: 200px;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    cursor: pointer;
    margin: auto;
    color: rgb(5, 89, 89);
}

#preview img {
    max-width: 100%;
    margin-top: 10px;
}

上面的标记和样式表创建了一个简单的破折号边框容器,其中包含简单的提示文本,如下面的屏幕截图所示:

Implementing File Input By Copy-Paste on the Web

现在我们已经创建了 UI,让我们在下一节中使用 JavaScript 添加一些有用的功能。

剧本

在本节中,我们将使用 JavaScript 将粘贴事件侦听器添加到粘贴区域。在从 DOM 获取粘贴区域以附加事件侦听器之前,我们首先等待 DOM 内容加载,如下面的代码片段所示。

document.addEventListener('DOMContentLoaded', () => {
    const pasteArea = document.querySelector('#pasteArea');

    pasteArea.addEventListener('paste', (event) => {

    });
});

在上面的代码片段中,我们添加了 DOMContentLoaded 事件的监听器。这使得我们可以等待 DOM 树创建后才能获取 DOM 元素。接下来,我们选择粘贴区域容器并向其附加粘贴事件侦听器。

从粘贴的项目中获取文件

粘贴事件处理程序在前面的代码片段中未实现。让我们通过从事件对象获取数据并将它们记录在控制台中来实现它。我们将在本文后面对数据进行更多处理,目前,我们只想确保在将项目粘贴到粘贴区域时接收到文件。下面的代码片段显示了粘贴事件处理程序的最小实现。

pasteArea.addEventListener('paste', (event) => {
        const items = event.clipboardData.items
        for (const item of items) {
            if (item.kind === 'file') {
                const file = item.getAsFile()

                console.log(file)
            }
        }
    })

在上面的代码片段中,我们从 event.clipboardData 对象获取项目。 event.clipboardData.items 是一个 DataTransferItemList,它是一个包含粘贴项目内容的类似列表的对象。这些项目存储在列表中,因为用户可以一次复制和粘贴多个项目。

接下来,我们使用 for ...of 循环迭代项目。在循环中,我们检查每个项目是否是一个文件。如果该项目是国王“文件”,我们将其作为文件获取并将其打印在浏览器的控制台上。

在控制台上打印文件信息对于网页的用户来说并不是很有用。让我们在下一节中做一些更有趣的事情。

预览上传的文件

如果我们不在任何地方显示它,那么在将项目粘贴到剪贴板后,用户将很难知道文件上传是否成功。通过显示指示成功的内容来表明文件已成功上传非常重要。还有什么比显示上传文件本身更好的指示上传成功的方法呢?

在本节中,我们将扩展粘贴事件处理程序以从接收到的文件创建 URL。文件加载到浏览器后,我们将使用创建的 URL 来呈现该文件。我们将利用 FileReader API 从文件创建 URL,如下面代码段中的代码所示。

pasteArea.addEventListener('paste', (event) => {
        const items = event.clipboardData.items
        for (const item of items) {
            if (item.kind === 'file') {
                const file = item.getAsFile()


                const reader = new FileReader();

                reader.onloadend = (e) => {
                    const url = e.target.result
                    console.log(url)

                };
                reader.readAsDataURL(file);
            }
        }
    });

在上面的代码片段中,我们创建了 FileReader 的实例并使用它来生成数据 URL。我们还向 FileReader 对象附加了一个 loadend 事件侦听器,我们将读取结果记录到控制台。这是预览文件的第一步,我们现在可以使用 URL 来显示文件。

假设用户粘贴了图像文件,以下代码片段显示了我们如何扩展事件处理程序以创建 URL 并显示图像文件。

 reader.onloadend = (e) => {
       const url = e.target.result
       const preview = document.querySelector('#preview')
       const img = document.createElement('img');

       img.src = url;
       preview.appendChild(img);
   };

在上面的代码片段中,我们从 DOM 获取预览容器并创建一个 img 元素来渲染图像。我们将创建的 URL 指定为图像的 src,并将图像附加到预览容器中。将图像附加到预览容器后,用户现在可以知道他们粘贴的图像已成功加载到网页中。

成功!我们已经成功地在网页上实现了通过复制粘贴的方式上传文件。这种文件上传方式使用户能够轻松上传文件,无需点击几个按钮来选择要上传的文件。 ClipboadEvent 接口提供了一种从浏览器上粘贴的项目收集数据的简单方法。 FileReader 接口允许我们从上传的文件创建 URL 并使用它来预览上传的文件。

欢迎在评论区畅所欲言。从 MDN 查找有关 ClipBoardEvent 和 FileReader 接口的更多信息。

版本聲明 本文轉載於:https://dev.to/ghostaram/implementing-file-input-by-copy-paste-on-the-web-npb?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-20
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-12-20
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-20
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-20
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-20
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-20
  • 填充空 Python 清單時如何避免 IndexError?
    填充空 Python 清單時如何避免 IndexError?
    修復將元素分配給列表時的IndexError嘗試通過依次分配每個元素來創建列表時,您可能會遇到IndexError如果目標清單最初為空。出現此錯誤的原因是您試圖存取清單中不存在的索引。 要解決此問題並將元素正確添加到列表中,您可以使用追加方法:for l in i: j.append(l)此...
    程式設計 發佈於2024-12-20
  • 如何在 Android 中解析 ISO 8601 日期/時間字串?
    如何在 Android 中解析 ISO 8601 日期/時間字串?
    在Android 解析ISO 8601 日期/時間字串問題:您已收到來自Web 服務的標準ISO 8601字串,例如“2010-10-15T09:27:37Z”。如何在Android中將此字串轉換為日期/時間物件以進行進一步操作? 答案:Android提供了一個SimpleDateFormat類,讓...
    程式設計 發佈於2024-12-20
  • 如何使用正規表示式檢測 URL(包括裸 URL)?
    如何使用正規表示式檢測 URL(包括裸 URL)?
    使用正規表示式偵測 URL您目前的程式碼無法符合缺少「http://」前綴的裸 URL。為了解決這個問題,可以考慮採用綜合正規表示式:https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\ ~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9(...
    程式設計 發佈於2024-12-20
  • 如何在 AngularJS 中有效地求和數組屬性?
    如何在 AngularJS 中有效地求和數組屬性?
    AngularJS 中的高級數組求和在 AngularJS 中,對數組屬性求和可能是一項常見任務。基本方法包括迭代數組並累積屬性值。然而,當面對多個陣列和不同的屬性名稱時,這種方法變得乏味。 為了解決這個問題,需要一個更靈活、可重複使用的解決方案,它允許對任何陣列屬性進行方便的求和。這可以使用 re...
    程式設計 發佈於2024-12-20
  • 如何在不進行按引用修改的情況下高效檢索第一個數組元素?
    如何在不進行按引用修改的情況下高效檢索第一個數組元素?
    在不透過引用操作的情況下檢索數組的第一個元素獲取數組的第一個元素可能是編程中的常見任務。雖然有多種方法可以實現這一點,但重要的是要考慮不使用引用操作的約束,就像 array_shift 的情況一樣。本文探討了在 PHP 中實現此目標的幾種有效方法。 O(n) 方法:一種方法是使用 array_val...
    程式設計 發佈於2024-12-20
  • C++ 函式宣告中「const」的真正意義是什麼?
    C++ 函式宣告中「const」的真正意義是什麼?
    解密返回類型、函數參數和成員函數中的Const 關鍵字C 程式碼片段中:const int* const Method3(const int* const&amp;) const;the術語“const”出現多次,每次都有特定含義。 1.傳回型別中的 Const(指向 Int Const 的...
    程式設計 發佈於2024-12-20
  • 使用“list.List”是建立帶有字串鍵和列表值的 Go 映射的最佳方法嗎?
    使用“list.List”是建立帶有字串鍵和列表值的 Go 映射的最佳方法嗎?
    建立字串到清單的對應問題:您想要建立一個有字串型別鍵的映射和列表類型的值。以下程式碼片段是否是正確的方法:package main import ( "fmt" "container/list" ) func main() { x :=...
    程式設計 發佈於2024-12-19
  • 使用 html css 和 javascript 幻覺的 Tic-Tac-Toe 遊戲 https://www.instagram.com/webstreet_code/
    使用 html css 和 javascript 幻覺的 Tic-Tac-Toe 遊戲 https://www.instagram.com/webstreet_code/
    在 Instagram 上關注我們:https://www.instagram.com/webstreet_code/ ? ✨ 有玻璃效果的井字遊戲! ✨? 我剛剛使用 HTML、CSS 和 JavaScript 構建了一款經典的 Tic-Tac-Toe 遊戲,具有時尚的玻璃態設計。觀看視頻,看看...
    程式設計 發佈於2024-12-19
  • TB 級資料庫的 MySQL 與 NoSQL:聚集索引何時是正確的解決方案?
    TB 級資料庫的 MySQL 與 NoSQL:聚集索引何時是正確的解決方案?
    MySQL:探索資料庫設計迷宮優化大型資料庫時,必須考慮資料庫設計策略以提高效能。在給定的場景中,包含執行緒的 TB 級資料庫由於其龐大的規模而面臨效能挑戰。本文探討了 MySQL 和 NoSQL 之間的選擇,重點介紹了 MySQL 的 innodb 引擎及其聚集索引的優點。 了解 MySQL 的 ...
    程式設計 發佈於2024-12-19

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3