vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
75 lines (70 loc) • 2.4 kB
JavaScript
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();
});
}
;