成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTML 5應用實戰:靈活拖拉文件

開發 前端
在HTML5中,出現了眾多的新的技術和特性,而本文將介紹的是目前HTML5標準中,對如何將用戶客戶端的文件拖拉到瀏覽器這一特性進行初步的講解。在HTML5中的標準中,提到了希望能在新一代瀏覽器中,支持用戶直接將客戶端桌面的文件拖放到瀏覽器中,甚至鼓勵做更多的工作(比如上傳文件)。

這篇文章將分如下幾個方面進行初步的分析和探討:

◆ 如何將文件拖放到web頁面中

◆ 在Javascript中分析拖拽文件

◆ 在客戶端裝載和解析文件

◆ 使用 XMLHttpRequest2異步上傳文件到服務端

◆ 上傳時顯示一個進度條

◆ 改進上傳文件的表單,甚至支持IE 6,以讓在各瀏覽器中可以兼容運行。

◆ 并介紹如何單單只用Javascript實現,不用任何框架。

目前瀏覽器對文件拖拉的支持

在我們開始講解前,我們先要說明下,由于HTML5的標準最終版本還沒完全發布,各瀏覽器也不是完全都對所有功能進行支持,所以本文的程序有可能在今后的各瀏覽器中不能完全運行成功,但至少在本文發表時,會對以下瀏覽器在如下各方面進行支持。

1) 目前程序能在所有的Firefox和Chrome的瀏覽器中很好的運行。

2) Opera瀏覽器能解通過Javascript去解析文件,但不支持文件的拖拉到瀏覽器中及使用XMLHttpRequest2去上傳文件。

3) IE和Safari不支持任何本文提到的API和新特性。

4) Apple不允許在iOS系統中使用HTML表單上傳文件。

下面,就讓我們開始學習之旅吧。

HTML和CSS

我們先來看下上傳文件的表單,代碼如下:

  1. <form id="upload" action="upload.php" method="POST" enctype="multipart/form-data"> 
  2. <fieldset> 
  3. <legend>HTML File Upload</legend> 
  4. <input type="hidden" id="MAX_FILE_SIZE" name="MAX_FILE_SIZE" value="300000" /> 
  5. <div> 
  6.     <label for="fileselect">Files to upload:</label> 
  7.     <input type="file" id="fileselect" name="fileselect[]" multiple="multiple" /> 
  8.     <div id="filedrag">or drop files here</div> 
  9. </div> 
  10. <div id="submitbutton"> 
  11.     <button type="submit">Upload Files</button> 
  12. </div> 
  13. </fieldset> 
  14. </form> 
  15. <div id="messages"> 
  16. <p>Status Messages</p> 
  17. </div> 

可以看到,在這個表單中,放置了一個文件選擇框,唯一跟HTML4不同的時,這個框采用的是HTML5中的一個新增的文件上傳框屬性multiple,允許選擇多個不同的文件。此外,在id為 filedrag的div中,這個區域是用來將文件拖拉放置的區域,下文中會用到。

接下來會看下CSS,代碼如下:

  1. #filedrag  
  2.   {  
  3.   display: none;  
  4.   font-weight: bold;  
  5.   text-align: center;  
  6.   padding: 1em 0;  
  7.   margin: 1em 0;  
  8.   color: #555;  
  9.   border: 2px dashed #555;  
  10.   border-radius: 7px;  
  11.   cursor: default;  
  12.   }  
  13.   #filedrag.hover  
  14.   {  
  15.   color: #f00;  
  16.   border-color: #f00;  
  17.   border-style: solid;  
  18.   box-shadow: inset 0 3px 4px #888;  
  19.   }  

在這段CSS中,設置了當文件拖放到頁面的指定區域時的樣式,這個樣式是當文件被拖動到指定區域時,才起到作用的,是通過Javascript擊發其起作用的,下文會提到。

HTML5中的文件API

在HTML5中,對文件的API有如下幾點的新的改進,其標準可以參考(http://www.w3.org/TR/file-upload/)。

FileList: 表示已選擇的文件,以數組的形式表示。

File: 代表一個單獨的文件

FileReader: FileReader是一個接口,它允許我們在客戶端讀取文件的數據,并且可以在Javascript中去使用。

開始動手寫Javascript

下面,我們開始動手編寫Javascript,首先我們編寫一些工具javascript,比如:

  1. // getElementById  
  2.   function $id(id) {  
  3.   return document.getElementById(id);  
  4.   }  
  5.   //  
  6.   // 輸出信息  
  7.   function Output(msg) {  
  8.   var m = $id("messages");  
  9.   m.innerHTML = msg + m.innerHTML;  
  10.   } 

接者,我們編寫init方法,去判斷文件API的可用性,代碼如下:

  1.  // 判斷當前瀏覽器中文件API是否可用  
  2.   if (window.File && window.FileList && window.FileReader) {  
  3.   Init();  
  4.   }  
  5.   //  
  6.   // 初始化程序  
  7.   function Init() {  
  8.   var fileselect = $id("fileselect"),  
  9.   filedrag = $id("filedrag"),  
  10.   submitbutton = $id("submitbutton");  
  11.   // 添加文件選擇的事件監聽  
  12.   fileselect.addEventListener("change", FileSelectHandler, false);  
  13.   // 判斷xmlhttprequest 2是否可用  
  14.   var xhr = new XMLHttpRequest();  
  15.   if (xhr.upload) {  
  16.   // file drop  
  17.   filedrag.addEventListener("dragover", FileDragHover, false);  
  18.   filedrag.addEventListener("dragleave", FileDragHover, false);  
  19.   filedrag.addEventListener("drop", FileSelectHandler, false);  
  20.   filedrag.style.display = "block";  
  21.   // remove submit button  
  22.   submitbutton.style.display = "none";  
  23.   }  
  24.   } 

程序中,首先判斷當前瀏覽器中文件API是否可用,如果可用的話則調用init的初始方法。在init方法中,做了如下幾件事情:

為文件的選擇框增加了上傳的監聽事件。

顯示#filedrag區域

設置了拖動文件經過放置區域時和文件離開放置區域時的事件以及樣式。

設置了當用戶將文件拖動到放置區域***松開鼠標,以決定文件放置時的事件。

這里還隱藏了提交按鈕,因為這里并不需要它了。

當然,這里還可以連傳統的文件上傳瀏覽框也去掉,但這并不是十分友好,所以這里采用的是兩者并存的方式。

而用到了XMLHttpRequest的upload方法,主要是防止在一些瀏覽器中如果當文件上傳API不可用時,則用舊的方法,不顯示文件拖拉框,取而代之的是顯示傳統的上傳提交按鈕。

考慮到很少用戶很熟悉文件的這種拖拉上傳用法,因此,我們在事件中對文件放置區域的樣式進行設置,當文件被拖拉到區域中時,區域的邊框會變成紅色,以提醒用戶,代碼如下:

  1. function FileDragHover(e) {  
  2.   e.stopPropagation();  
  3.   e.preventDefault();  
  4.   e.target.className = (e.type == "dragover" ? "hover" : "");  
  5.  } 

這里判斷是否文件拖拉到區域上方,如果是的話,則采用樣式中的hover樣式。

接下來,我們會在另外的一個div區域中,顯示文件上傳的小結信息,代碼如下:

  1. function FileSelectHandler(e) {  
  2.   FileDragHover(e);  
  3.   // 獲得所有的文件列表  
  4.   var files = e.target.files || e.dataTransfer.files;  
  5.   // 循環處理每個文件  
  6.   for (var i = 0, f; f = files[i]; i++) {  
  7.   ParseFile(f);  
  8.   }  
  9.   }  

在FileSelectHandler事件中,實現了如下的功能:

1 調用FileDragHover()方法移除了hover的樣式,并且取消瀏覽器的響應事件,否則的話瀏覽器會嘗試顯示文件的內容。

2 將上傳的文件放置到FileList對象數組中去,包括用傳統文件上傳框上傳的及用拖拉方法上傳的。

3 單獨使用一個方法ParseFile輸出上傳每個文件的具體屬性信息,代碼如下;

  1. function ParseFile(file) {  
  2.   Output(  
  3.   "  
  4.   File information: " + file.name +  
  5.   " type: " + file.type +  
  6.   " size: " + file.size +  
  7.   " bytes  
  8.   "  
  9.   );  
  10.   } 

#p#

使用Javascript打開客戶端文件

現在,我們已經把客戶端機器上的文件成功拖拉到瀏覽器中了,也就是說,我們用新的拖拉的方法,完成了以往要使用傳統的文件上傳選擇框才能完成的工作!接下來,我們嘗試通過Javascript,去判斷用戶上傳的文件類型,并學習如何使用Javascript去操作客戶端的文件。

首先,為什么要通過Javascript去分析操作客戶端的文件呢?假如要求用戶上傳很多文件,或者上傳指定格式的圖片,假如用戶選好上傳文件到服務端后,服務端才判斷發現文件不符合要求,再要求用戶重新上傳的話,給用戶的體驗則不大友好,所以,希望能在用戶在客戶端選擇完文件后就馬上能判斷出文件的大小和類型,如果是圖片的話,甚至可以實現客戶端圖片預覽的效果。

在HTML5的起草標準中,提供了FileReader接口去處理客戶端的文件,有如下幾個重要API:

readAsText(File f, [encoding]):將一個文件讀入到字符串中去,其中可以選用文件的編碼,默認的是UTF-8

.readAsDataURL(File f): 將文件以data URL編碼的方式讀入文件內容,dat Url方式是一種以BASE64編碼在頁面中展示文件的方法,詳細見:http://en.wikipedia.org/wiki/Data_URI_scheme

.readAsBinaryString(File f): 將文件以二進制方式讀取。.readAsArrayBuffer(File f):.將文件作為ArrayBuffer對象的方式讀取。ArrayBuffer詳見http://www.khronos.org/registry/typedarray/specs/latest/

接下來,我們看下如何在Javascript中異步打開讀取文件。

Javascript中異步打開文件

先來復習下之前我們用到的parseFile方法,代碼如下:

  1. function ParseFile(file) {  
  2.   Output(  
  3.   "  
  4.   File information: " + file.name +  
  5.   " type: " + file.type +  
  6.   " size: " + file.size +  
  7.   " bytes  
  8.   "  
  9.   );  
  10.   } 

這里只是簡單顯示了文件的文件名和文件大小,而接下來我們要判斷是這個文件是否屬于文件類型的文件(即text/plain,text/html,text/css等),可以使用FileReader.readAsText()方法讀取并且去掉其中的<,>符號,代碼如下;

  1. if (file.type.indexOf("text") == 0) {  
  2.   var reader = new FileReader();  
  3.   reader.onload = function(e) {  
  4.   Output(  
  5.   "  
  6.   " + file.name + ":  
  7.   " +  
  8.   e.target.result.replace(//g, ">") +  
  9.   "  
  10.   "  
  11.   );  
  12.   }  
  13.   reader.readAsText(file);  
  14.   } 

同樣,我們希望將一張圖片從用戶的資源管理器中,拖拉到頁面的放置區域后,能馬上顯示這張圖片的實際內容以及大小,可以用如下代碼實現:

  1. 0.// display an image   
  2. 0.if (file.type.indexOf("image") == 0) {   
  3. 0. var reader = new FileReader();   
  4. 0. reader.onload = function(e) {   
  5. 0. Output(   
  6. 0. "<p><strong>" + file.name + ":</strong><br />" +   
  7. 0. '<img src="' + e.target.result + '" /></p>'   
  8. 0. );   
  9. 0. }   
  10. 0. reader.readAsDataURL(file);   
  11. 0.}  

這里,直接將圖片的內容以FileReader的readAsDataURL方法讀取入并顯示。

***,我們可以通過http://blogs.sitepointstatic.com/examples/tech/filedrag/2/index.html觀看我們的

DEMO演示,請讀者嘗試從自己電腦上的windows資源管理器中,拖放圖片或其他類型文

件到頁面的指定區域中,則會發現瀏覽器能自動識別用戶拖放的文件,當然,請使用Chrome

或Firefox瀏覽器才能看到效果。

小結

在本文中,為讀者介紹了HTML5中新的文件處理API,利用文件處理API,可以實現讓瀏覽器識別從用戶端拖放到頁面的文件,在下一講中,將重點介紹如何上傳這些已經拖放了的文件。

原文:http://tech.it168.com/a2011/1207/1285/000001285230.shtml

【編輯推薦】

  1. HTML 5 Web開發:防止瀏覽器假死的方法
  2. HTML 5無法幫你實現的五件事(目前)
  3. 使用HTML 5制作物理游戲
  4. HTML 5 Canvas(畫布)教程之圖像處理
  5. 用HTML 5打造斯諾克桌球俱樂部
責任編輯:陳貽新 來源: it168
相關推薦

2011-12-12 10:08:39

jQuery MobiHTML5

2013-05-27 14:03:10

綜合布線布線經驗

2012-03-06 10:56:32

HTML 5

2010-09-03 08:58:01

HTML 5

2012-05-15 09:42:06

2012-06-07 15:51:40

HTML5

2010-08-10 09:08:29

WebSocketsHTML 5

2012-05-23 13:00:37

HTML5

2009-09-08 13:47:11

SproutCoreHTML 5應用框架

2011-05-11 12:59:18

HTML5

2012-05-21 09:31:56

HTML5

2012-06-23 20:13:44

HTML5

2012-06-14 10:22:21

網易微博HTML5開發

2012-06-18 14:22:09

HTML5

2013-03-22 08:59:57

HTML5移動應用Web App

2014-03-20 10:50:44

HTML5 定位技術

2012-05-17 09:45:30

2012-06-20 15:21:11

HTML5Opera歐朋瀏覽器

2012-06-27 17:17:55

HTML5

2009-07-02 15:01:07

HTML 5
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美日韩精品 | 欧美色性 | 久久综合久色欧美综合狠狠 | 人人射人人| 亚洲精品一区二区三区中文字幕 | 欧美一区二区三区视频在线观看 | 免费一区二区 | 韩日在线视频 | 亚洲精品一区av在线播放 | 久草在线免费资源 | 午夜精品久久久久久不卡欧美一级 | 久久久久久高清 | 高清18麻豆 | 一区二区三区成人 | 狠狠躁躁夜夜躁波多野结依 | 91超碰在线观看 | 国产成人免费视频 | 福利在线观看 | 色黄爽 | 国产欧美精品在线观看 | 97久久精品午夜一区二区 | 狠狠综合久久av一区二区老牛 | 成年人在线观看视频 | 欧美在线网站 | 国产精品视频一区二区三区不卡 | 成人福利网站 | 在线免费av电影 | 成人美女免费网站视频 | 不卡在线视频 | 亚洲国产日本 | 国产大学生情侣呻吟视频 | 欧美日韩不卡合集视频 | 国产精品欧美一区二区三区不卡 | 日韩精品中文字幕一区二区三区 | 亚洲精品一区中文字幕乱码 | 午夜国产一级 | 久久午夜精品 | 成人免费视频网 | 色吧综合网 | www.亚洲一区 | 日韩电影免费在线观看中文字幕 |