20240527每日前端-------聊聊前端input file 文件框“取消”按钮事件

20240527每日前端-------聊聊前端input file 文件框“取消”按钮事件

码农世界 2024-05-28 后端 70 次浏览 0个评论

文件选择窗口

正常我们使用input type="file"属性上传文件,会唤起系统的文件选择器如下:

20240527每日前端-------聊聊前端input file 文件框“取消”按钮事件

打开按钮

可以通过change事件监听:

// 增加的部分:创建 loading 实例变量
let loadingInstance;
let box = document.createElement('div');
document.body.appendChild(box);
box.setAttribute('style', 'display: block; height: 0; width: 0; overflow: hidden;');
let input = document.createElement('input');
input.setAttribute('name', 'file');
input.setAttribute('type', 'file');
input.setAttribute('multiple', 'multiple');
box.appendChild(input);
// 文件选择框弹出前,显示 loading
loadingInstance = Loading.service({ fullscreen: true, text: '正在上传...' });
const closeLoadingAndCleanup = () => {
    document.body.removeChild(box);
    if (loadingInstance) loadingInstance.close();
};
input.click();
input.addEventListener('change', function() {
    let files = input.files;
    if (files.length > 0) {
        cb(files);
    } else {
        // 如果用户没有选中任何文件,也可以认为是一种取消操作,关闭加载框
        closeLoadingAndCleanup();
    }
});

但是如果,这个时候点击取消按钮,或者x关闭弹窗,原生的input标签是无法监听取消事件的。并且取消也不会触发input的change事件,这种情况下该怎么处理?

前提知识:

浏览器页面获取焦点事件早于 onchange 事件约20毫秒。

基于此点,我们可以监听focus事件,设置一个setTimeout ,那只要控制这个focus事件在change事件之后执行,就可以通过设置一个变量和setTimeout方法实现

// 取消事件
window.addEventListener(
    'focus',
    () => {
        setTimeout(() => {
            if (!input.files.length) {
                // 取消逻辑处理
                closeLoadingAndCleanup();
            }
        }, 300)
    },
    { once: true }
)

转载请注明来自码农世界,本文标题:《20240527每日前端-------聊聊前端input file 文件框“取消”按钮事件》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,70人围观)参与讨论

还没有评论,来说两句吧...

Top