<style> #test{ height: 300px; width: 300px; border: 1px solid #ddd; } </style> <div id="test" contenteditable></div> <script> init({el:"#test", callback: testCb}); function testCb(res){ console.log(res) } </script>
function init({el, callback}){ // 獲取到操做的文件 } function fileToBase64(file, callback){ // 文件轉爲base64拋出 } window.init = init;
要使用到的三個相關事件, 分別是: dragover, drop, dragleavejavascript
- 當元素或者選擇的文本被拖拽到一個有效的放置目標上時,觸發 dragover 事件。
- 當一個元素或是選中的文字被拖拽釋放到一個有效的釋放目標位置時,觸發drop事件
- 被拖動的元素或文本選區移出有效釋放目標區 drop 元素在有效釋放目標區上釋放, 觸發dragleave事件
咱們能夠在dragover和dragleave來處理拖動噹噹前位置和拖動完成後或離開的樣式。在drop事件回調來處理要上傳的文件html
function init({el, callback}){ const upBox = document.querySelector(el); if(!upBox){return}; // 拖拽 upBox.addEventListener('dragover', dragoverFile) upBox.addEventListener('drop', dropFile) upBox.addEventListener('dragleave', dragleaveFile) function dragoverFile(e) { e.preventDefault(); } function dragleaveFile(e) { } function dropFile(e) { e.preventDefault(); let fileList = e.dataTransfer.files; let file = fileList[0]; // 在這裏就能夠拿到拖拽的文件了,傳到下一個函數進行處理 fileToBase64(file, callback) } }
粘貼的話用到的事件就是 paste 了
function init({el, callback}){ const upBox = document.querySelector(el); if(!upBox){return}; // 拖拽 upBox.addEventListener('dragover', dragoverFile) upBox.addEventListener('drop', dropFile) upBox.addEventListener('dragleave', dragleaveFile) function dragoverFile(e) { e.preventDefault(); } function dragleaveFile(e) { } function dropFile(e) { e.preventDefault(); let fileList = e.dataTransfer.files; let file = fileList[0]; // 在這裏就能夠拿到拖拽的文件了,傳到下一個函數進行處理 fileToBase64(file, callback) } // 粘貼 upBox.addEventListener('paste', pasteFile) function pasteFile(e) { e.preventDefault(); const items = e.clipboardData.items; for( let i=0; i<items.length; i++ ){ let item = items[i]; if(item.kind === "file"){ const file = item.getAsFile(); fileToBase64(file, option) } } } }
這裏並不能粘貼文件
function fileToBase64(file, callback){ // 實例化一個FileReader對象, 當讀取完成文件時,把base64拋出 const reader = new FileReader(); reader.onload = function(e){ callback(e.target.result) } reader.readAsDataURL(file); }
寫的比較簡單,只是列出了大概思路,實際業務呢,仍是要擴展好多的。