我們在使用異步事件處理時還能順便獲得一項優勢,那就是能夠監控文件的讀取進度;這對於讀取大文件、查找錯誤和預測讀取完成時間非常實用。
onloadstart
和 onprogress
事件可用於監控讀取進度。
以下示例演示瞭如何通過顯示進度條來監控讀取狀態。要查看進度指示器的實際效果,請嘗試讀取大文件或遠程驅動器中的文件。
<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>
提示:要查看進度指示器的實際效果,請嘗試讀取大文件或遠程驅動器中的資源。