Files
layui/examples/upload.html
sunxiaobin89 5ab142153b ci: 添加 lint 和 format 工具,统一代码格式 (#2905)
* style: 统一代码格式,修复ESLint错误

- 为所有模块添加尾随逗号
- 修复缺少分号的语句
- 统一对象字面量格式
- 添加ESLint配置文件和文档
- 更新package.json中的脚本和依赖项

* build: 添加 ESLint 配置文件以支持 IE9+ 兼容性

* refactor(upload): 使用已缓存的hint实例替换直接调用

优化代码性能,避免重复实例化hint对象,直接使用模块顶部已缓存的实例

* chore: 更新.gitignore文件以包含更多忽略规则

添加了更多常见的临时文件、编辑器文件、构建输出目录和运行时数据的忽略规则,使项目更加整洁并避免不必要的文件被提交到版本控制中

* fix(lay.js): 修复passive事件监听器选项的返回值

确保getter函数返回true以正确支持passive事件监听

* refactor(form): 移除表单模块中的冗余代码

删除表单模块中无实际作用的冗余代码行,这些代码只是将属性重新赋值为自身,没有实际功能意义

* fix(form): 修复复选框状态处理逻辑

确保复选框的 indeterminate 和 checked 状态被正确转换为布尔值,并优化事件调用时的空格格式

* feat(eslint): 完善 ESLint 配置并添加 VSCode 支持

添加 VSCode 配置文件以支持 ESLint 自动修复和格式化
更新 ESLint 配置,增强代码风格和兼容性规则
修复 package.json 中的脚本拼写错误并添加 format 脚本
调整 .gitignore 以允许特定 VSCode 配置文件

* style: 统一代码中的引号格式并修复缩进问题

统一将双引号改为单引号,修复部分代码缩进不一致的问题,提升代码风格一致性

* docs: 删除过时的ESLint配置文档文件

* build: 采用 prettier 作为代码格式化工具,剔除 ESLint 格式化部分

* chore: 剔除 .vscode/ 配置,保持编辑器中立

* build: 修改 ESLint 为「扁平化配置」方式,避免大量参数堆砌

* chore: 格式化代码

* ci: 添加 git hooks 和 CI 环节把关代码风格

* ci: update

* ci: update

* test: 测试 ci format

* ci: 改用 husky 作为 git hooks,与 Layui 3 保持一致

经测试,simple-git-hooks 生成的 pre-commit 默认为 sh,在 Windows 不兼容(必须用 git bash 执行 commits)

* build: 新增 CI 和生产环境跳过 husky 安装的判断

* build: 剔除重复配置

* build: 优化 eslint 配置

---------

Co-authored-by: 贤心 <3277200+sentsim@users.noreply.github.com>
2025-11-10 16:03:37 +08:00

416 lines
12 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1"
/>
<title>上传组件 - layui</title>
<link rel="stylesheet" href="../src/css/layui.css" />
<style>
.layui-upload-img {
width: 92px;
height: 92px;
margin: 0 10px 10px 0;
}
hr {
margin: 32px 0;
}
</style>
</head>
<body class="layui-padding-5">
<div class="layui-upload">
<button type="button" class="layui-btn" id="test1" name="123">
上传图片
</button>
<div class="layui-upload-list">
<img class="layui-upload-img" src="" id="demo1" />
<p id="demoText"></p>
</div>
</div>
<div
class="layui-progress layui-progress-big"
lay-showPercent="yes"
lay-filter="demo"
>
<div class="layui-progress-bar" lay-percent=""></div>
</div>
<hr />
<div class="layui-upload">
<button type="button" class="layui-btn" id="test2">多图片上传</button>
<div class="layui-upload-list" id="demo2"></div>
</div>
<hr />
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-normal" id="testList">
选择多文件
</button>
<div class="layui-upload-list">
<table class="layui-table">
<thead>
<th>文件名</th>
<th>大小</th>
<th>上传进度</th>
<th>操作</th>
</thead>
<tbody id="demoList"></tbody>
</table>
</div>
<button type="button" class="layui-btn" id="testListAction">
开始上传
</button>
</div>
<hr />
<div class="layui-btn-container">
<button
type="button"
class="layui-btn test333"
lay-data="{size:10,url:'a'}"
id="test3"
>
<i class="layui-icon">&#xe67c;</i>上传文件
</button>
<button
type="button"
class="layui-btn layui-btn-primary test333"
lay-data="{size:20,url:'b'}"
id="test33"
>
<i class="layui-icon">&#xe67c;</i>换个样式
</button>
<button type="button" class="layui-btn" id="test4">
<i class="layui-icon">&#xe67c;</i>上传视频
</button>
<button type="button" class="layui-btn" id="test5">
<i class="layui-icon">&#xe67c;</i>上传音频
</button>
</div>
<hr />
<div class="layui-btn-container">
<button class="layui-btn testm" lay-data="{url: '/a/'}">
参数设在元素上
</button>
<button
class="layui-btn testm"
lay-data="{url: '/b/', accept: 'file',size:5}"
>
参数设在元素上
</button>
</div>
<hr />
<div class="layui-btn-container">
<button type="button" class="layui-btn layui-btn-normal" id="test6">
选择文件
</button>
<button type="button" class="layui-btn" id="test7">开始上传</button>
</div>
<hr />
<br />
<div class="layui-upload-drag" id="test8">
<i class="layui-icon">&#xe67c;</i>
<p>点击上传,或将文件拖拽到此处</p>
</div>
<hr />
<br />
绑定原始文件域:<input type="file" name="file" id="test9" />
<script
src="../src/layui.js"
src1="https://cdnjs.cloudflare.com/ajax/libs/layui/2.7.6/layui.js"
></script>
<script>
layui.use(['upload', 'element', 'form'], function () {
var $ = layui.$;
var upload = layui.upload;
var element = layui.element;
// 模拟接口
var url = ''; // 'https://httpbin.org/post';
// 创建实例
var uploadInst = upload.render({
elem: '#test1',
url: url, // 若需模拟上传过程,而不真实上传文件,可使用开源的 HTTP 模拟接口: httpbin
// size: 2000, //限制文件大小,单位 KB
// accept: 'file',
method: 'get',
fileAccept: 'image/*',
exts: 'jpg|png|gif|bmp|jpeg|pdf',
data: {
// 额外参数
a: 1,
b: function () {
return 2;
}
},
choose: function (obj) {
console.log('choose', obj);
},
before: function (obj) {
//预读本地文件示例不支持ie8
obj.preview(function (index, file, result) {
$('#demo1').attr('src', result); //图片链接base64
});
return;
layer.msg('不允许上传');
return false;
},
done: function (res, index) {
//如果上传失败
if (res.code > 0) {
return layer.msg('上传失败');
}
//上传成功
console.log(res, index);
},
error: function (index, upload) {
this.item.html('重选上传');
//演示失败状态,并实现重传
var demoText = $('#demoText');
demoText.html(
'<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-mini demo-reload">重试</a>'
);
demoText.find('.demo-reload').on('click', function () {
uploadInst.upload();
});
element.progress('demo', '0%');
},
progress: function (n, elem, res, index) {
console.log(n + '%', elem, res, index); //获取进度百分比
element.progress('demo', n + '%'); //可配合 layui 进度条元素使用
}
});
// 重载上述实例
uploadInst.reload({
field: 'avatar',
accept: 'images', // 只允许上传图片
acceptMime: 'image/*' // 只筛选图片
// size: 2,
});
// 演示多图片上传
upload.render({
elem: '#test2',
url: url, // 实际使用时改成您自己的上传接口即可
multiple: true, // 多文件
unified: true, // 一起上传 --- 2.8.8+
accept: 'images',
number: 3, // 同时上传的数量
size: 1024,
before: function (obj) {
// 预读本地文件示例不支持ie8
obj.preview(function (index, file, result) {
$('#demo2').append(
'<img src="' +
result +
'" alt="' +
file.name +
'" class="layui-upload-img">'
);
});
// this.files = obj.pushFile();
},
done: function (res, index) {
// 上传完毕
console.log(res, index);
},
allDone: function (obj) {
console.log(obj);
}
});
// 演示多文件列表 --- 本示例仅演示未开启 unified 属性的情况
var demoListView = $('#demoList');
var uploadListIns = upload.render({
elem: '#testList',
url: url, // 实际使用时改成您自己的上传接口即可
accept: 'file',
multiple: true,
number: 5,
auto: false,
bindAction: '#testListAction',
// size: 30,
choose: function (obj) {
var files = (this.files = obj.pushFile()); // 将每次选择的文件追加到文件队列
//读取本地文件
obj.preview(function (index, file, result) {
var tr = $(
[
'<tr id="upload-' + index + '">',
'<td>' + file.name + '</td>',
'<td>' + (file.size / 1014).toFixed(1) + 'kb</td>',
'<td><div class="layui-progress" lay-filter="progress-' +
index +
'"><div class="layui-progress-bar" lay-percent=""></div></div></td>',
'<td>',
'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>',
'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>',
'</td>',
'</tr>'
].join('')
);
//单个重传
tr.find('.demo-reload').on('click', function () {
obj.upload(index, file);
});
//删除
var that = this;
tr.find('.demo-delete').on('click', function () {
console.log(files, index);
delete files[index]; //删除对应的文件
tr.remove();
uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
});
demoListView.append(tr);
element.render('progress');
});
},
done: function (res, index, upload) {
//if(res.code == 0){ //上传成功
var tr = demoListView.find('tr#upload-' + index),
tds = tr.children();
tds.eq(3).html(''); //清空操作
delete this.files[index]; //删除文件队列已经上传成功的文件
return;
//}
this.error(index, upload);
},
allDone: function (obj) {
console.log(obj);
},
error: function (index, upload) {
var tr = demoListView.find('tr#upload-' + index),
tds = tr.children();
tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
},
progress: function (n, elem, e, index) {
console.log(n);
console.log(index);
element.progress('progress-' + index, n + '%'); //进度条
}
});
upload.render({
elem: '.test333',
url: url,
accept: 'file',
choose: function (obj) {
console.log(this.elem);
},
done: function (res) {
console.log(res);
}
});
upload.render({
elem: '.testm',
done: function (res, index, upload) {
//获取当前触发上传的元素,一般用于 elem 绑定 class 的情况,注意:此乃 layui 2.1.0 新增
var item = this.item;
}
});
/*
upload.render({
elem: '#test33',
url: '',
accept: 'file',
done: function(res){
console.log(res)
}
});*/
upload.render({
elem: '#test4',
url: url, // 实际使用时改成您自己的上传接口即可
accept: 'video',
done: function (res) {
console.log(res);
}
});
upload.render({
elem: '#test5',
url: '',
accept: 'audio',
done: function (res) {
console.log(res);
}
});
//手动上传
upload.render({
elem: '#test6',
url: url, // 实际使用时改成您自己的上传接口即可
auto: false,
// multiple: true,
bindAction: '#test7',
choose: function (obj) {
var that = this;
obj.preview(function (index, file) {
that.elem.after(
'<span class="layui-inline layui-upload-choose">' +
file.name +
'</span>'
);
console.log(file.name);
//obj.resetFile(index, file, '123.jpg');
});
},
before: function () {
console.log(345);
},
done: function (res) {
console.log(res);
}
});
upload.render({
elem: '#test8',
url: url, // 实际使用时改成您自己的上传接口即可
done: function (res) {
console.log(res);
}
});
upload.render({
elem: '#test9',
url: url, // 实际使用时改成您自己的上传接口即可
done: function (res) {
console.log(res);
}
});
});
</script>
</body>
</html>