UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

75 lines (70 loc) 2.4 kB
"use strict"; exports.__esModule = true; exports.chooseFile = chooseFile; var _lodashUni = require("lodash-uni"); var _bindEvent = require("./bindEvent"); var _wait = require("./wait"); /** * 选择文件。 * * @param accept 接受的文件类型,其中默认的 `image` 表示 `image/*` * @param multiple 是否多选 * @returns 返回选中的文件列表 */ /** * 选择文件。 * * @param accept 接受的文件类型,其中默认的 `image` 表示 `image/*` * @param options 选项 * @returns 返回选中的文件列表 */ function chooseFile(accept, multipleOrOptions) { return new Promise(function (resolve) { var options = typeof multipleOrOptions === 'boolean' ? { multiple: multipleOrOptions } : multipleOrOptions || {}; var input = document.createElement('input'); input.style.all = 'unset'; input.style.position = 'fixed'; input.style.top = '0px'; input.style.clip = 'rect(0, 0, 0, 0)'; input.style.webkitUserSelect = 'text'; // @ts-ignore input.style.MozUserSelect = 'text'; // @ts-ignore input.style.msUserSelect = 'text'; input.style.userSelect = 'text'; input.type = 'file'; input.accept = accept === 'image' ? 'image/*' : accept; input.multiple = !!options.multiple; options.afterElementReady == null || options.afterElementReady({ el: input }); document.body.appendChild(input); var handleChange = function handleChange() { unbindChange(); unbindCancel(); unbindFocus(); unbindTouchend(); if (input) { var files = input.files || []; document.body.removeChild(input); input = null; resolve(Object.freeze((0, _lodashUni.toArray)(files))); } }; var unbindChange = (0, _bindEvent.bindEvent)(input)('change', handleChange); // 标准取消监听 但有兼容问题 // https://caniuse.com/?search=HTMLInputElement%20cancel var unbindCancel = (0, _bindEvent.bindEvent)(input)('cancel', handleChange); // 取消监听 hack // https://stackoverflow.com/a/67603015 var unbindFocus = (0, _bindEvent.bindEvent)(window)('focus', function () { return (0, _wait.wait)(1000).then(handleChange); }); var unbindTouchend = (0, _bindEvent.bindEvent)(window)('touchend', function () { return (0, _wait.wait)(1000).then(handleChange); }); input.click(); }); }