<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.thumb {
height: 75px;
border: 1px solid #000;
margin: 10px 5px 0 0;
}
</style>
</head>
<body>
<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>
</body>
</html>
<script>
document.getElementById('files').addEventListener('change', handleFileSelect, false);
function handleFileSelect(evt) {
var files = evt.target.files;
console.log(files);
for (var i = 0, file; file = files[i]; i++) {
console.log(file);
if (!file.type.match('image.*')) {
continue;
};
var reader = new FileReader(); //新建一個 FileReader,為了在onload取得值
reader.onload = function(theFile) { //onload時取得FileList
return function(e) {
var span = document.createElement('span');
span.innerHTML = ['<img class="thumb" src="', e.target.result,'" title="', escape(theFile.name), '"/>'].join(''); //寫入HTML
//e.target.result change時,取得的結果
document.getElementById('list').insertBefore(span, null);
};
}(file);
reader.readAsDataURL(file);
}
}
</script>
- return function(e)裡的e是甚麼
FileReader 的 event 物件,當資料讀取完畢會產生這個 event 物件,作為參數傳給 function
在上面的例子也就是那個 e
- for迴圈{}後的(file)是什麼意思
用 <input type="file">
選擇檔案後,產生 change 事件。
因此 function handleFileSelect(evt)
的 evt 會有該事件的相關資訊
evt.target 代表事件發生的元素,也就是 <input type="file">
本身
所以 evt.target.files 會是一個類似陣列(array like)的資料
裡面的每個元素 (evt.target.files[i]) 代表選擇的其中一個檔案
所以你問的 file 就是 evt.target.files[i]
- reader.readAsDataURL(file);為甚麼是放在最後面
這是非同步處理的狀況,javascript 常常會遇到非同步處理
(例如 setTimeout、ajax 等)
這時我們會先告訴程式(員工)說「當你完成了XXX之後,要做些甚麼」(reader.onload=....)
然後才說「我說完了,去做你的工作吧」(reader.readAsDataURL)
- evt所接收到的是change事件嗎?
是,剛剛第 2 點提到了。