HTML5中的拖放功能 | 打卡每天一份勸退技能

2021-02-14 程式設計師哆啦A夢

大家好,我是魔王哪吒,很高興認識你~~

哪吒人生信條:如果你所學的東西 處於喜歡 才會有強大的動力支撐

每天學習編程,讓你離夢想更新一步,感謝不負每一份熱愛編程的程式設計師,不論知識點多麼奇葩,和我一起,讓那一顆四處流蕩的心定下來,一直走下去,加油,2021加油!歡迎關注加我vx:xiaoda0423,歡迎點讚、收藏和評論

不要害怕做夢,但是呢,也不要光做夢,要做一個實幹家,而不是空談家,求真力行。投魔王哪吒一票,謝謝記得為我投票哦!!!(魔王哪吒

前言

如果這篇文章有幫助到你,❤️關注+點讚❤️鼓勵一下作者,接收好挑戰了嗎?文章公眾號首發,關注 程式設計師哆啦A夢 第一時間獲取最新的文章

筆芯❤️~

知識點

拖拽的體驗,你享受過嗎,在HTML5之前,可以使用事件mousedown,mousemove,mouseup巧妙實現頁面的拖放操作,但注意拖放的操作範圍只是局限在瀏覽器內部

而HTML5的拖放API功能直接實現拖放操作,而且拖放的範圍已經超出瀏覽器的邊界,HTML5提供的文件api支持拖拽多個文件並上傳。

要學會掌握html5中的拖放api和 文件api,光標拖放事件,從web網頁上訪問本地文件系統。

拖放api

在html5中的拖放api重點:

第一,為頁面元素提供了拖放特性;

第二,為光標增加了拖放事件;

第三,提供了用於存儲拖放數據的DataTransfer對象

draggable特性

draggable特性用於定義元素是否允許用戶拖放:提供了三個值

true,false,auto

把元素變成可以拖放的:

<div draggable="true"></div>

img元素和a元素默認是可以拖放的

光標拖放事件

在html5中提供了7個與拖放相關的光標事件:

按照時間的順序:

第一,開始拖拽時觸發的事件,事件的作用對象是被拖拽的元素-dragstart事件

第二,拖放過程中觸發的事件,事件的作用對象是被拖拽的元素-drag事件

第三,在拖放的元素進入本元素的範圍內時觸發,事件的作用對象是拖放過程中光標經過的元素-dragenter元素

第四,在拖放的元素正在本元素的範圍內移動時觸發,事件的作用對象是拖放過程中光標經過的元素-dragover元素

第五,在拖放的元素離開本元素的範圍時觸發,事件的作用對象是拖放過程中光標經過的元素-dragleave元素

第六,在拖放的元素被拖放到本元素中時觸發,事件的作用對象是拖放的目標元素-drop元素

第七,在拖放操作結束時觸發,事件的作用對象是被拖拽的元素-dragend事件

DataTransfer對象

在html5中提供了DataTransfer對象,用來支持拖拽數據的存儲。

實現拖放的過程中數據交換。

DataTransfer對象:

屬性

第一,dropEffect屬性:用來設置或獲取拖拽操作的類型 和 要顯示的光標類型。

如果該操作的效果與起初設置的effectAllowed效果不符,則拖拽操作失敗。可以設置修改,包含值可為:none, copy, link, move

第二,effectAllowed屬性:用來設置或獲取數據傳送操作可應用於操作對象的源元素,指定值:none, copy, copyLink, copyMove, link, linkMove, move, all 和 uninitialized

第三,type屬性:獲取在dragstart事件出發時為元素存儲數據的格式,如果是外部文件的拖拽,則返回Files。

第四,files屬性:獲取存儲在DataTransfer對象中的正在拖放的文件列表FileList,可以使用數組的方式去遍歷。

方法

第一,clearData()方法:清除DataTransfer對象中存放的數據:

clearData([sDataFormat])

[sDataFormat]為可選參數,取值可能為:Text,URL,File,HTML,Image,設置後,可刪除指定格式的數據,如果省略該參數,則清除全部數據。

第二,setData()方法:向內存中的DataTransfer對象添加指定格式的數據:

setData([sDataFormat],[data])

第三,getData()方法:從內存的DataTransfer對象中獲取數據

getData([sDataFormat])

第四,setDragImage()方法:設置拖放時跟隨光標移動的圖片

setDragImage([imgElement],[x],[y])

[imgElement]表示圖片對象,[x],[y]分別表示相對於光標位置的橫坐標和縱坐標

第五,addElement()方法:添加一起跟隨拖放的元素,如果想讓某個元素跟隨被拖動元素一起被拖放,則使用此方法

addElement([element])

[element]表示一起跟隨拖動的元素對象

示例
// 源元素
<div id="dragSource" draggable="true">
 拖動
 <img src="images/dadaqianduan.png" width="50" height="50">
</div>

// 目標元素
<div id="dropTarget"></div>

添加ondragstart監聽事件,給拖放的源元素添加ondragstart監聽事件,在事件觸發時把源元素裡的內容追加至dataTransfer對象中。

最後,把添加監聽事件的處理函數DragStart()追加到window.onload事件中。

function DragStart() {
 var source = document.getElementById("dragSource"); // 拖放源元素
 // 監聽dragstart事件,作用在源元素上
 source.addEventListener("dragstart", function(e){
  e.dataTransfer.setData('text/plain', e.target.innerHTML);
  // 向dataTransfer對象中追加數據
  e.dataTransfer.effectAllowed="copy";
 },false);
}
// 添加函數DragStart到window.onload監聽事件
window.addEventListener("load",DragStart,false);

添加dragover監聽事件,給拖放的目標元素添加dragover監聽事件,在事件觸發時改變目標元素的樣式,並屏蔽瀏覽器的默認處理事件。

把添加監聽事件的處理函數DragOver()追加到window.onload事件中,對於目標元素preventDefault(),必須取消瀏覽器的默認處理,否則將無法實現拖放功能。

function DragOver() {
// 拖放目標元素
 var target = document.getElementById('dropTarget');
 // 監聽dragover事件,作用在目標元素上
 target.addEventListener("dragover", function(e){
 // 改變樣式
  this.className = "dragover";
  // 取消瀏覽器的默認處理
  e.preventDefault();
 },false);
}
// 添加函數DragStart到window.onload監聽事件
window.addEventListener("load", DragOver, false);

給拖放的目標元素添加ondrop監聽事件,事件觸發時獲取dataTransfer對象中的數據,並追加到目標元素中,同時還還原了樣式。

把添加監聽事件的處理函數Drop()追加到window.onload事件中。

function Drop(){
// 拖放目標元素
 var target = document.getElementById('dropTarget');
 // 監聽drop事件,作用在目標元素上
 target.addEventListener('drop',function(e){
  var data = e.dataTransfer.getData('text/plain');
  //取得dataTransfer對象中的數據
  this.innerHTML += data;
  e.dataTransfer.dropEffect = "copy";
  // 還原樣式
  this.className=""
 },false);
}
// 添加函數DragStart到window.onload監聽事件
window.addEventListener("load",Drop, false);

文件api

在html5中提供了關於文件操作的文件api,通過編程方式選擇和訪問文件數據。

如:FileList對象,File對象,Blob接口,FileReader接口

增加的標籤特性

在html5中file類型的表單元素增加了multiple特性和accept特性

multiple特性

multiple特性可允許用戶同時選擇多個上傳文件。

<input type="file" multiple/>

得到一個FileList對象,是一個File對象的列表

accept特性

規定了可通過文件上傳提交的文件類型,實現了打開文件窗口時,默認選中指定的文件類型:

<input type="file" accept="image/gif"/>

FileList對象和File對象

在FileList對象裡的每一個文件又是一個File對象

示例:

<form action="" method="post">
 <input type="file" id="files" multiple/>
 <input type="button" value="顯示文件" onclick="showFiles()"/>
 <p id="msg"></p>
</form>

function ShowFiles(){
// 獲取FileList對象
 var fileList = document.getElementById("files").files;
 var msg = document.getElementById("msg");
 var file;
 for(var i=0; i<fileList.length; i++){
  file = fileList[i];
  msg.innerHTML += file.name + ";<br/>";
 }
}

Blob對象

Blob對象表示原始二進位數據,該Blob接口有兩個屬性:size和type

第一,size屬性,表示Blob對象的字節長度,可以藉助

FileReader接口讀取Blob對象的二進位數據,如果Blob對象沒有字節數,則為0

第二,type屬性,表示Blob對象的MIME類型,未知 類型,則返回一個 空字符串。

第三,slice()方法,使用slice()方法可以實現文件的切割,並返回一個新的Blob對象。

File對象 和 Blob對象

File對象 繼承了 Blob對象,所以 File對象 也可以使用 Blob對象的屬性和方法(File對象可以使用size屬性 和 type屬性)

獲取文件的大小和類型

示例:

<form action="" method="post">
 <input type="file" id="files" multiple accept="image/*"/>
 <input type="button" value="顯示文件數據" onclick="ShowType()"/>
 <p id="msg"></p>
</form>

function ShowType(){
// 獲取FileList對象
 var files = document.getElementById("files").files;
 var msg = document.getElementById("msg");
 var file;
 for(var i=0; i<files.length; i++){
  file=fileList[i];
  msg.innerHTML += "字節長度:"+file.size+";<br/>";
  msg.innerHTML += "文件類型:"+file.type+";<br/>";
 }
}

FileReader接口卡

FileReader接口 提供了 一些 讀取文件的方法一個波愛護讀取結果的 事件模型。

FileReader接口 主要把 文件讀入內存, 並讀取文件中 的數據。

提前檢測瀏覽器是否支持,實現該接口FileReader

if(typeof FileReader == "undefined"){
 console.log();
} else {
 var reader = new FileReader();
}

FileReader接口三個屬性:

readyState屬性,只讀

讀取文件的狀態:

EMPTYP,值為0, 表示新的FileReader接口已經構建,且 沒有調用 任何讀取方法 時的默認狀態。LOADING,值為1,表示有讀取文件的方法正在讀取 File 對象 或 Blob 對象,且沒有錯誤發生。DONE,值為2,表示讀取文件結束,可能整個 File對象 或 Blob對象 已經完全 讀入內存 中,在文件讀取的過程中出現錯誤,或在讀取過程中使用了 abort()方法 強行中斷。

result屬性,只讀

獲取已經讀取的文件 數據。如是 圖片,將返回 base64 格式的圖片數據。

error屬性,只讀

獲取讀取文件過程中出現的錯誤:4種類型

NotFoundError,找不到讀取的資源文件。

FileReader接口 會 返回 NotFoundError 錯誤,同時讀取文件 的方法也會 拋出 NotFoundError 錯誤異常

FileReader 接口 會返回 SecurityError 錯誤,同時讀取文件的 方法也會拋出 SecurityError 錯誤異常

NotReadableError,無法讀取的錯誤。

FileReader 接口會 返回 NotReadableError 錯誤,同時讀取文件 的方法 也會拋出 NotReadableError 錯誤異常

通常是數據的URL表示的網址 長度受到 限制

FileReader接口的方法

第一,readAsArrayBuffer() 方法,將文件讀取為 數組緩衝區

readAsArrayBuffer(<blob>);

其中的<blob>表示一個Blob對象的文件。

readAsArrayBuffer()方法 會把該 Blob 對象 的文件讀取為 數組緩衝區

第二,readAsBinaryString()方法,將文件讀取為二進位字符串。

readAsBinaryString(<blob>);

其中的<blob>表示一個Blob對象的文件。

readAsBinaryString()方法 會把該 Blob 對象 的文件讀取為二進位字符串

第三,readAsText() 方法,將文件讀取為二進位字符串

readAsText(<blob>,<encoding>);

// 讀取為文本,encoding 為文本的編碼方式

第四,readAsDataURL()方法 將文件讀取為 DataURL 字符串:

readAsDataURL(<blob>);

// 讀取為DataURL字符串

第五,abort()方法,中斷讀取操作

abort() // 沒有參數

接口的事件

loadstart事件,當開始讀取數據時 觸發的事件loadend事件,當結束讀取數據時觸發的事件,數據讀取可能成功也可能失敗FileReader接口

示例:

// 讀取文件
function ReadAs(action){
 var blob = document.getElementById("files").files[0];
 if(blob){
  var reader = new FileReader(); // 聲明接口對象
  // 讀取文件的方法
  switch(action.toLowerCase()){
   case "binarystring":
    reader.readAsBinaryString(blob);
    break;
   case "arraybuffer":
    reader.readAsArrayBuffer(blob);
    break;
   case "text":
    reader.readAsText(blob);
    break;
   case "dataurl":
    reader.readAsDataURL(blob);
    break;
  }
  
  reader.onload = function(e){
   // 訪問FileReader 的接口屬性 result,把讀取到內存裡的內容獲取出來
   var result = this.result;
   // 如果是圖文件
   if(/image\/\w+/.test(blob.type) && action.toLowerCase() == "dataurl"){
    document.getElementById("result").innerHTML = "<img src='" + result + "'/>";
   } else {
    document.getElementById("result").innerHTML = result;
   }
  }
 }
}

FileReader接口的事件

示例:

<form action="" method="post">
 <input type="file" id="files" multiple accept="image/*"/>
 <input type="button" value="讀取文件" onclick="FileReaderEvent()"/>
 <p id="message"></p>
</form>

var blob = document.getElementById("files").files[0];
var message = document.getElementById("message");

var reader = new FileReader();
// 添加 loadstart 事件
reader.onloadstart = function(e){

}
// 添加 progress 事件
reader.onprogress = function(e){

}
// 添加 load 事件
reader.onload = function(e){

}
// 添加 abort 事件
reader.onabort = function(e){

}
// 添加 error 事件
reader.onerror = function(e){

}
// 添加 loadend 事件
reader.onloadend = function(e){

}

圖片拖入瀏覽器

示例:

定義一個拖放的 drop 事件處理函數 dropHandle()

定義一個用於加載單個 文件的函數 loadImg()

// 目標元素的變量
var target;
// drop 事件處理函數
function dropHandle(e){
// 獲取拖拽的文件
 var fileList = e.dataTransfer.files,
 fileType;
 // 遍歷
 for(var i=0; i<fileList.length; i++){
  fileType = fileList[i].type;
  if(fileType.indexOf('image') == -1) {
   alert('');
   return;
  }
  // 加載單個文件
  loadImg(fileList[i]);
 }
}

// 加載
function loadImg(file){
// 聲明接口對象
var reader = new FileReader();
// 添加load事件處理
reader.onload = function(e){
 var oImg = document.createElement("img");
 oImg.src = this.result;
 target.appendChild(oImg);
}
// 讀取文件
reader.readAsDataURL(file);
}

頁面加載完成後,可獲取target目標容器,是用於存放拖放進的圖片。

給target容器添加 dragover事件處理 和 drop 事件處理

window.onload = function() {
 // 獲取目標元素
 target = document.getElementById('dropTarget')
 // 給目標元素添加 dragover 事件處理
 target.addEventListener('dragover', function(e){
  e.preventDefault();
 },false);
 
 target.addEventListener('drop', dropHandle, false);
}

❤️關注+點讚+收藏+評論+轉發❤️,原創不易,鼓勵筆者創作更好的文章

點讚、收藏和評論

我是Jeskson(達達前端),感謝各位人才的:點讚、收藏和評論,我們下期見!(如本文內容有地方講解有誤,歡迎指出☞謝謝,一起學習了)

我們下期見!

文章持續更新,可以微信搜一搜「 程式設計師哆啦A夢 」第一時間閱讀,回復【資料】有我準備的一線大廠資料,本文 http://www.dadaqianduan.cn/#/ 已經收錄

github收錄,歡迎Star:https://github.com/webVueBlog/WebFamily

相關焦點

  • localStorage和sessionStorage本地存儲 | 打卡每天一份勸退技能
    每天學習編程,讓你離夢想更新一步,感謝不負每一份熱愛編程的程式設計師,不論知識點多麼奇葩,和我一起,讓那一顆四處流蕩的心定下來,一直走下去,加油,2021加油!文章公眾號首發,關注 程式設計師哆啦A夢 第一時間獲取最新的文章筆芯❤️~知識點使用HTML5中的Web Storage API, 可以在客戶端存儲更多的數據,,可以實現數據在多個頁面中共享甚至是同步
  • 直接從 OS X 系統的 Spotlight 中拖放文件
    Spotlight 是 OS X 系統中非常重要也非常實用的一個功能,可以在極短的時間內搜索出保存在你電腦各個角落的文件,用它來找某些不知道放在哪裡的文件真是又方便又快捷。這個工具就位於你 OS X 系統的右上角。
  • 拖放傳送不支持蛋
    ·《寶可夢Home》服務最新的上線日期為「二月中旬」,此前僅為「二月」、·高級會員訂閱中每人可用200個箱子。·《寶可夢Home》支持的各正作之間的傳輸可用通過拖放完成。·玩家可以利用各種條件和順序來檢索箱子。
  • H5和HTML5是一回事嗎
    經常有人問我何為H5,或發個網頁給我看問是不是H5,真讓我回答,一兩句也講不清楚,所以我想先聊聊我理解的H5廣告究竟如何定義...H5廣告是什麼?這也造成了,擁有較高技術能力,並且成熟周期緩慢的前端人才變成了稀缺資源,而H5廣告的生產最終執行都是由前端完成的。 對呀!那麼多單位缺人怎麼辦?怎麼來做H5?面對大勢
  • 在微信小程序中使用打卡功能,這些打卡的設置技巧你知道嗎?
    怎樣才能快速上手、高效引流和活躍用戶,是每個社群運營者都很頭疼的問題,單純的在社群中進行話題引導、紅包促活,似乎都已經逐漸的失去了效果。在網際網路逐漸成熟的當下,要像進一步的讓社群 「活起來」 ,必要時刻還是得通過群服務工具來進行實現。
  • 2020年針灸技能新大綱版打卡上線!
    2020年針灸技能的新大綱版打卡上線了!
  • 叫我女皇陛下新增靈妖助戰功能介紹 靈妖怎麼助戰
    叫我女皇陛下新增靈妖助戰功能介紹。叫我女皇陛下是一款基於html5研發的2D卡通版養成類遊戲,在這裡,你可以開啟自己的皇宮養成之旅,結識各種絕色皇子,並與他結緣。小編今天帶來的就是新增的靈妖助戰功能介紹,小夥伴們快來看看吧!
  • 微軟神級 Surface 手機確定,雙屏應用+跨屏交互拖放
    微軟神級 Surface 手機確定,雙屏應用+跨屏交互拖放從曝光的照片可以看到,Surface 負責人 Panos Panay 手上拿的雙屏手機與此前展示的原型機有所不同,這款手機邊緣設計看起來更加圓潤,機身也更加纖薄,此前展示的原型機採用光滑的背面設計,而 Panos Panay 手上這款在左側屏幕背面可以看出有凹進處理的設計。
  • 超級精靈球高級回收功能有什麼用 回收功能介紹
    超級精靈球高級回收功能有什麼用。超級精靈球是一款充滿回憶且高度還原的冒險類html5遊戲,也是一款集寵物養成、策略於一體的回合制遊戲,玩家扮演訓練師,在寵物小精靈的世界遇到了野生的小精靈便可將其捕獲並培養。小編今天帶來的就是回收功能介紹,還不知道高級回收功能有什麼用的小夥伴們快來看看吧!
  • 推薦 25個HTML5製作工具合集,終於可以自己做HTML5頁面了!
    排名不分先後,功能大同小異,可按照自身需求挑選。案例:匆匆那年的我們 句句戳中你的內心據Wix統計每天有超過45000的新用戶加入Wix,每個類目下有上百的HTML5模板可供使用,響應式設計,在手機端也有很好的展示。另外也支持大量第三方插件。12Google Web Designer網址:http://www.google.com/webdesigner/
  • 每天「打卡上班」,「打卡下班」英語怎麼說?用clock輕鬆搞定!
    這一期我們來說一說工作中的英語,現在很多企業對考勤都看得特別特別嚴。只要遲到一秒鐘,那你一個月的努力就都泡湯了。一不小心你的全勤獎(attendance bonus)就沒有了。哭泣一秒鐘。那我們經常說到的每天「打卡上班」,「打卡下班」英語怎麼說?
  • 打卡網紅櫻花郵局,快來挑選一份你的專屬櫻花禮
    繁花似錦,落英繽紛這個櫻風物語的浪漫櫻花世界引得無數遊客為之折腰而如今櫻花謝幕在潮白河櫻花公園裡又出現了一位新晉「網紅」——櫻花郵局你不去打卡嗎門口的網紅櫻花樹和櫻花郵筒也成為遊客拍照打卡的不二選擇。櫻花郵局主要功能定位包括創意郵局、輕食、休憩休閒;涵蓋創意信件郵寄、許願牌、櫻花禮伴手禮及主題美食售賣等內容;休息區還專門設置卡座供遊客休息及品嘗美食。櫻花郵局整體採用極簡實用風格搭配櫻花主題元素,打造出極具特色的櫻花主題郵局。
  • 妖怪寶可萌騎拉帝納怎麼樣 寵物技能及神器介紹
    妖怪寶可萌騎拉帝納寵物怎麼樣,騎拉帝納技能及專屬神器介紹。妖怪寶可萌是一款在精靈世界中開展最獨特戰鬥的html5網頁遊戲,寵物在遊戲裡是非常重要的存在,今天小編帶來的攻略就是有關於騎拉帝納寵物的技能及專屬神器介紹,還不知道如何騎拉帝納怎麼樣的小夥伴們快來看看吧!
  • 【21天打卡】童學惠口才第2期報名通知!每天5-10分鐘,練就好口才!
    培養良好的語言能力需要一個堅持而長期的過程,尤其是普通話,沒有高頻、標準的語言環境,孩子們掌握的語言技能永遠停留在紙上談兵的水平。巴菲特說過:「最簡單的讓財富增加50%的辦法,就是精進溝通能力。如果你不能溝通,就好像是在黑暗中摸索,什麼都不會得到。」
  • 這款考勤打卡神器大大提高物業人的幸福感
    從籤到、指紋打卡,到手機app定位打卡,很多公司的管理者和員工之間的「貓鼠」遊戲從未停止過!跨越了三個技術時代,很多移動辦公應用中的打卡功能,變成了他們討厭又害怕的小魔咒。打卡相機,釘釘打卡......想必無數物業人被領導要求用手機軟體打卡考勤,上下班的動態不得不被老闆掌握。
  • 大天使之劍敏法技能選擇 縛魂之力技能分析
    大天使之劍敏法技能選擇 縛魂之力技能分析。大天使之劍是一款能夠給玩家帶來酣暢淋漓的打擊感的戰鬥冒險類html5網頁遊戲,由網遊原班人馬精心打造,繼承了該遊戲一直以來的打擊風格,有著多種職業角色可供玩家選擇,華麗炫酷的技能設計,不管是打怪刷圖還是競技場真人戰鬥,都能給人一種親身體驗的真實感,喜歡這種熱血戰鬥類風格遊戲的玩家,那就千萬不要錯過這款遊戲了。
  • 口袋之旅捷克羅姆怎麼配招 捷克羅姆技能詳解
    口袋之旅捷克羅姆怎麼配招,捷克羅姆技能特點詳解。口袋之旅h5一款還原口袋妖怪原作的回合制策略html5遊戲。遊戲內的口袋妖怪和原作一樣共分為17種不同屬性,例如火、水、草、電、冰、蟲、飛行、地面、巖石等等。小編今天帶給大家的是捷克羅姆的技能特點解析,還不知道捷克羅姆怎麼樣的小夥伴們一起來看看吧!
  • 口袋之旅妖火紅狐精靈詳解 妖火紅狐有哪些技能
    口袋之旅妖火紅狐精靈詳解,妖火紅狐技能特性介紹。口袋之旅h5一款還原口袋妖怪原作的回合制策略html5遊戲,不同的口袋妖怪有不同的屬性,招式也有其屬性,角色也是豐富多樣,一共400多個口袋妖怪,近千個不同的技能,給你帶來GBA時代那最初的激情與澎湃。
  • 叫我女皇陛下珍品怎麼重生 珍品重生功能介紹
    叫我女皇陛下珍品重生功能介紹。叫我女皇陛下是一款基於html5研發的2D卡通版養成類遊戲,在這裡,你可以開啟自己的皇宮養成之旅,結識各種絕色皇子,並與他結緣。小編今天帶來的新增的珍品重生功能介紹,還不知道珍品怎麼重生的小夥伴們快來看看吧!
  • 鬥羅大陸天使光羽怎麼樣 天使光羽技能詳細解析
    鬥羅大陸天使光羽怎麼樣,天使光羽技能詳細解析。鬥羅大陸H5是一部以同名小說世界觀為遊戲世界觀研發的一款html5網遊,裡面的玩法眾多,小編今天帶來的就是鬥羅大陸核心魂環天使光羽的技能介紹,還不知道天使光羽怎麼樣的玩家們快來看看吧!