--- tags: HTML5 --- # [補充連結] HTML5 補充 ## HTML5 張互賓老師的教材 先放老師的教材網站: * https://docs.webmix.cc/html5/ 往網址追可以發現老師的網站,甚至也有別的教材(裡面有 JavaScript 基礎的,有興趣的應該可以補): * http://webmix.cc/pages/tutorials 搭配互賓老師的教材章節分類一下: ## 7. File * (官方文件)[Working Draft: File API W3C](https://www.w3.org/TR/FileAPI/) * [MDN Web Docs: 在網頁應用程式中使用本地檔案](https://developer.mozilla.org/zh-TW/docs/Web/API/File/Using_files_from_web_applications) * (推薦閱讀)[石頭閒語: HTML5 - File API 簡易教學](https://www.rocksaying.tw/archives/15328315.html) ### `input[type="file"]` 的 onchange 事件 `input[type="file"]` 的 onchange 事件會透過事件物件(function 的第一個參數,常用 `e`)監聽的 target(`e.target`,其實就是被監聽的節點本身[`this`])取得一個檔案陣列 `e.target.files`,單檔選取時也是,要直接取得檔案必須搭配索引值。 假設 `input[type="file"]` 元素被抓取到、並被存取於變數 `file` 中,對它進行 onchange 事件監聽,也就是: * `file.addEventListener("change", function(e) {...})` * `file.onchange = function(e) {...}` 發生 onchange 事件時可以用以下 3 種方式取得檔案: * `e.target.files[0]` * `this.files[0]` * `file.files[0]` ### FileReader 物件 `readAsXxx()` 函式的結果 FileReader 物件用 `readAsXxx()` 方法讀取檔案進來,必須以 `onload` 事件確認 FileReader 物件已將檔案讀取完成後,才能去取得檔案。 onload 事件監聽的 `e.target` 是 FileReader 物件,而這個物件用 `readAsXxx(...)` 方法讀取檔案的結果則會用存在 FileReader 物件的屬性 `result`中。 假設建立一個 FileReader 物件 `var file_reader = new FileReader();` 用 `readAsXxx(Ooo)` 讀取,並監聽 FileReader 物件是否讀取完成,也就是: * `file_reader.addEventListener("load", function(e) {...})` * `file_reader.onload = function(e) {...}` 讀取完發生`onload` 事件時,用以下 3 種方式都可以取得讀完的檔案: * `e.target.result` * `this.result` * `file_reader.result` ## 8. Drag and Drop ### 拖曳區塊的 ondrop 事件 #### 1. 停用預設行為 `ondrop` 事件必須以事件物件的方法停用預設行為,否則拉入檔案時會自動進行預設行為(彈出新分頁開啟該檔案)。 * `e.preventDefault()` #### 2. 取得檔案 ondrop 事件物件的 target 指的是被監聽的節點本身,停用預設行為後拖曳進來的檔案,必須透過事件的 dataTransfer(`e.dataTransfer`)獲得一個檔案陣列 `e.dataTransfer.files`,再搭配索引值才能直接取得。> 假設想要拖曳檔案進來的 div 元素被抓取到、並被存取於變數 `drop_zone` 中,對它進行 ondrop 事件監聽,也就是: * `drop_zone.addEventListener("drop", function(e) {...})` * `drop_zone.ondrop = function(e) {...}` 發生 ondrop 事件時可以用以下方式取得檔案: * `e.dataTransfer.files[0]` 就只有這種方式,因為檔案是以陣列形式存取在 `e.dataTransfer` 的 `files` 中, 而 `e.dataTransfer` 並不是指被監聽的元素 `drop_zone`,也就不會是 `this`。 ## 10. Web Worker ### Worker 物件的 onmessage 事件 Worker 物件的 `postMessage(...)` 函式,會使 Worker 發生 onmessage 事件,並儲存檔案於 Worker 物件的 `data` 屬性中。 所以需要在主執行緒監聽 Worker 物件是否有回傳訊息,假設建立新的 Worker 物件去執行指定的 js 檔: * `var work = new Worker("檔案位置/執行緒名稱.js")` 可以用以下兩個方式監聽: * `worker.addEventListener("message", function (e) {...})` * `worker.onmessage = function(e) {...}` 一直重提的概念:事件觸發去執行的 function,第一個參數(通常用 `e`),代表的是**事件本身**,也就是 onmessage 事件,它會有一個 `data` 屬性,存放被傳來的訊息(可以是任何東西,在作業中是倒數的變數 `i`)。所以要取得透過 `postMessage(...)` 傳來的參數,可以用以下的方法: * `e.data` ## 其他、共用 ### 新增 DOM 元素、插入/替換/刪除節點 1. [MDN Web Docs: Document.createElement()](https://developer.mozilla.org/zh-TW/docs/Web/API/Document/createElement#語法) 2. [MDN Web Docs: Node 方法](https://developer.mozilla.org/zh-CN/docs/Web/API/Node#方法) appendChild()、insertBefore()、replaceChild()、removeChild() 3. [JS常見DOM節點操作示例【建立 ,插入,刪除,複製,查詢】](https://codertw.com/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC/200101/) 4. [MDN Web Docs: Element.insertAdjacentHTML()](https://developer.mozilla.org/zh-TW/docs/Web/API/Element/insertAdjacentHTML) 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up