From 8617de5c38854c61b09529f8c3c043e5907efde3 Mon Sep 17 00:00:00 2001 From: Frost-ZX <30585462+Frost-ZX@users.noreply.github.com> Date: Wed, 10 Nov 2021 00:47:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=BB=E5=8F=96=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/js/utils.js | 64 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/src/assets/js/utils.js b/src/assets/js/utils.js index f4b0632..9aa5eb1 100644 --- a/src/assets/js/utils.js +++ b/src/assets/js/utils.js @@ -30,17 +30,73 @@ class Utils { console.log('[JSONP]', data); }, }; - var scriptElem = document.createElement('script'); + var el = document.createElement('script'); Object.assign(config, options); window[config.cbName] = config.cbFunc; - scriptElem.addEventListener('load', function () { + el.addEventListener('load', function () { this.remove(); }); - scriptElem.setAttribute('src', config.url); + el.setAttribute('src', config.url); - document.body.appendChild(scriptElem); + document.body.appendChild(el); + } + + /** + * 以文本方式读取文件(异步) + * + * @param {Event} ev 输入框 change 事件对象 + * @param {boolean} resetValue 是否自动重置输入框 value 属性 + * + * @returns {Promise} `{ name: 文件名, content: 文件内容 }` + */ + readFileAsText(ev, resetValue) { + const blank = []; + + /** @type {HTMLInputElement} */ + const el = ev.currentTarget; + + /** @type {FileList} */ + const files = el.files; + + if (!files || files.length === 0) { + return Promise.resolve(blank); + } + + const fnProc = (procResolve, procReject) => { + const reads = []; + + for (let i = 0; i < files.length; i++) { + const file = files[i]; + const reader = new FileReader(); + const fnRead = (readResolve, readReject) => { + // 成功 + reader.onload = () => { + readResolve(reader.result); + }; + // 失败 + reader.onerror = () => { + readReject(''); + }; + // 读取 + reader.readAsText(file); + }; + + reads.push(new Promise(fnRead)); + } + + Promise.all(reads).then((res) => { + // [成功] + procResolve(res); + resetValue && el.setAttribute('value', ''); + }).catch(() => { + // [失败] + procReject(blank); + }); + }; + + return new Promise(fnProc); } }