咱們在使用異步事件處理時還能順便得到一項優點,那就是可以監控文件的讀取進度;這對於讀取大文件、查找錯誤和預測讀取完成時間很是實用。html
onloadstart
和 onprogress
事件可用於監控讀取進度。web
如下示例演示瞭如何經過顯示進度條來監控讀取狀態。要查看進度指示器的實際效果,請嘗試讀取大文件或遠程驅動器中的文件。異步
<style> #progress_bar { margin: 10px 0; padding: 3px; border: 1px solid #000; font-size: 14px; clear: both; opacity: 0; -moz-transition: opacity 1s linear; -o-transition: opacity 1s linear; -webkit-transition: opacity 1s linear; } #progress_bar.loading { opacity: 1.0; } #progress_bar .percent { background-color: #99ccff; height: auto; width: 0; } </style> <input type="file" id="files" name="file" /> <button onclick="abortRead();">取消讀取</button> <div id="progress_bar"><div class="percent">0%</div></div> <script> var reader; var progress = document.querySelector('.percent'); function abortRead() { reader.abort(); } // 文件上傳出錯後的函數 function errorHandler(e) { switch(e.target.error.code) { case e.target.error.NOT_FOUND_ERR: alert('文件沒找到'); break; case e.target.error.NOT_READABLE_ERR: alert('文件不可讀'); break; case e.target.error.ABORT_ERR: break; default: alert('讀取文件時出錯'); }; } // 更新進度條 function updateProgress(e) { // e 是一個 ProgressEvent. if (e.lengthComputable) { var percentLoaded = Math.round((e.loaded / e.total) * 100); // 更新進度條長度 if (percentLoaded < 100) { progress.style.width = percentLoaded + '%'; progress.textContent = percentLoaded + '%'; } } } // 選擇上傳文件後的方法 function handleFileSelect(e) { // 在選擇新文件後重置進度指示器 progress.style.width = '0%'; progress.textContent = '0%'; reader = new FileReader(); reader.onerror = errorHandler; reader.onprogress = updateProgress; reader.onabort = function(e) { alert('已取消讀取'); }; reader.onloadstart = function(e) { document.getElementById('progress_bar').className = 'loading'; }; reader.onload = function(e) { // 確保進度條最後顯示100% progress.style.width = '100%'; progress.textContent = '100%'; setTimeout("alert('文件已讀取成功!')", 0); } // 將文件做爲二進制字符串讀入 reader.readAsBinaryString(e.target.files[0]); } document.getElementById('files').addEventListener('change', handleFileSelect, false); </script>
提示:要查看進度指示器的實際效果,請嘗試讀取大文件或遠程驅動器中的資源。