<!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 點提到了。