mirror of https://github.com/layui/layui
commit
5ad35db868
|
@ -2,7 +2,7 @@ blank_issues_enabled: false
|
|||
contact_links:
|
||||
- name: 😇 问题反馈
|
||||
url: https://gitee.com/layui/layui/issues
|
||||
about: 使用 Layui 过程中遇到的 Bug、异常或其他困惑。
|
||||
about: 使用 Layui 过程中遇到的 Bug、异常或其他功能困惑。
|
||||
- name: 📄 官方文档
|
||||
url: https://layui.dev/
|
||||
about: 建议您在创建 Issue 之前,仔细查阅 Layui 开发文档,以便对其有更深入的了解,和更好地分析问题。
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -14,7 +14,7 @@ layui.use(function(){
|
|||
// dropdown 在表格中的应用
|
||||
table.render({
|
||||
elem: '#ID-dropdown-demo-table',
|
||||
url: '/static/2.8/json/table/demo5.json',
|
||||
url: '/static/json/2/table/demo5.json',
|
||||
title: '用户数据表',
|
||||
cols: [[
|
||||
{type: 'checkbox', fixed: 'left'},
|
||||
|
@ -74,4 +74,4 @@ layui.use(function(){
|
|||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -175,6 +175,36 @@
|
|||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>limitTemplet <sup>2.8.18+</sup></td>
|
||||
<td>
|
||||
|
||||
用于自定义条目模板,如:
|
||||
|
||||
```
|
||||
limitTemplet: function(item) {
|
||||
return item + ' / page';
|
||||
}
|
||||
```
|
||||
|
||||
</td>
|
||||
<td>function</td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>skipText <sup>2.8.18+</sup></td>
|
||||
<td>
|
||||
|
||||
用于自定义跳页区域文本,如:
|
||||
|
||||
```
|
||||
skipText: ['Go to', '', 'Confirm']
|
||||
```
|
||||
|
||||
</td>
|
||||
<td>array</td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>theme</td>
|
||||
<td>
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<table class="layui-table" lay-data="{height:315, url:'/static/2.8/json/table/user.json', page:true}" id="ID-table-demo-init">
|
||||
<table class="layui-table" lay-data="{height:315, url:'/static/json/2/table/user.json', page:true}" id="ID-table-demo-init">
|
||||
<thead>
|
||||
<tr>
|
||||
<th lay-data="{field:'id', width:80, sort: true}">ID</th>
|
||||
|
@ -13,4 +13,4 @@
|
|||
</thead>
|
||||
</table>
|
||||
|
||||
<!-- import layui -->
|
||||
<!-- import layui -->
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
// 创建渲染实例
|
||||
table.render({
|
||||
elem: '#ID-table-demo-css',
|
||||
url:'/static/2.8/json/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url:'/static/json/2/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
page: true,
|
||||
height: 'full-35',
|
||||
lineStyle: 'height: 151px;', // 定义表格的多行样式
|
||||
|
|
|
@ -55,7 +55,7 @@ layui.use(['table', 'dropdown'], function(){
|
|||
// 创建渲染实例
|
||||
table.render({
|
||||
elem: '#test',
|
||||
url: '/static/2.8/json/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: '提示',
|
||||
|
|
|
@ -49,7 +49,7 @@ layui.use(function(){
|
|||
// 渲染
|
||||
table.render({
|
||||
elem: '#ID-table-demo-editmodes',
|
||||
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
page: true,
|
||||
css: [ // 设置单元格样式
|
||||
// 取消默认的溢出隐藏,并设置适当高度
|
||||
|
@ -178,4 +178,4 @@ layui.use(function(){
|
|||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -14,7 +14,7 @@ layui.use(function(){
|
|||
// 创建表格实例
|
||||
table.render({
|
||||
elem: '#ID-table-demo-editable',
|
||||
url: '/static/2.8/json/table/edit.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/table/edit.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
page: true,
|
||||
//,editTrigger: 'dblclick' // 触发编辑的事件类型(默认 click )。 v2.7.0 新增,之前版本固定为单击触发
|
||||
css: [
|
||||
|
@ -55,4 +55,4 @@ layui.use(function(){
|
|||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -9,7 +9,7 @@ layui.use(function(){
|
|||
// 渲染
|
||||
table.render({
|
||||
elem: '#ID-table-demo-filter',
|
||||
url:'/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url:'/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
toolbar: 'default',
|
||||
height: 315,
|
||||
cols: [function(){
|
||||
|
@ -45,4 +45,4 @@ layui.use(function(){
|
|||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -11,7 +11,7 @@ layui.use(['table', 'dropdown', 'util'], function(){
|
|||
table.render({
|
||||
elem: '#ID-table-onrowContextmenu',
|
||||
defaultContextmenu: false, // 是否在 table 行中允许默认的右键菜单
|
||||
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
page: true,
|
||||
cols: [[
|
||||
{field:'id', title:'ID', width:80, fixed: 'left', unresize: true},
|
||||
|
@ -53,4 +53,4 @@ layui.use(['table', 'dropdown', 'util'], function(){
|
|||
obj.setRowChecked({selectedStyle: true}); // 标注行选中状态样式
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -14,7 +14,7 @@ layui.use('table', function(){
|
|||
// 创建渲染实例
|
||||
table.render({
|
||||
elem: '#ID-table-demo-page',
|
||||
url:'/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url:'/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
page: { // 支持传入 laypage 组件的所有参数(某些参数除外,如:jump/elem) - 详见文档
|
||||
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'], //自定义分页布局
|
||||
//curr: 5, //设定初始在第 5 页
|
||||
|
@ -39,4 +39,4 @@ layui.use('table', function(){
|
|||
layer.msg(eventValue);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
> 假设这是一段数据源:<a href="/static/2.8/json/table/demo3.json" target="_blank">/static/2.8/json/table/demo3.json</a><br>
|
||||
> 假设这是一段数据源:<a href="/static/json/2/table/demo3.json" target="_blank">/static/json/2/table/demo3.json</a><br>
|
||||
尽管它并不符合 table 组件默认规定的数据格式([#详见](#options-async-data)),但可以通过 parseData 回调将其进行转换。
|
||||
|
||||
<table class="layui-hide" id="ID-table-demo-parse"></table>
|
||||
|
@ -11,7 +11,7 @@ layui.use('table', function(){
|
|||
// 渲染
|
||||
table.render({
|
||||
elem: '#ID-table-demo-parse',
|
||||
url:'/static/2.8/json/table/demo3.json',
|
||||
url:'/static/json/2/table/demo3.json',
|
||||
page: true,
|
||||
response: {
|
||||
statusCode: 200 // 重新规定成功的状态码为 200,table 组件默认为 0
|
||||
|
|
|
@ -38,7 +38,7 @@ layui.use(function(){
|
|||
// 创建表格实例
|
||||
table.render({
|
||||
elem: '#ID-table-demo-search',
|
||||
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
cols: [[
|
||||
{type: 'radio', title: '😊', fixed: true}, // 单选框
|
||||
{field:'id', title: 'ID', width:80, sort: true, fixed: true},
|
||||
|
@ -74,4 +74,4 @@ layui.use(function(){
|
|||
return false; // 阻止默认 form 跳转
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -13,7 +13,7 @@ layui.use('table', function(){
|
|||
// 渲染
|
||||
table.render({
|
||||
elem: '#ID-table-demo-setRowChecked',
|
||||
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
page: true,
|
||||
cols: [[
|
||||
// {type: 'radio', fixed: 'left'},
|
||||
|
@ -58,4 +58,4 @@ layui.use('table', function(){
|
|||
};
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -27,7 +27,7 @@ layui.use(['table'], function(){
|
|||
// 创建渲染实例
|
||||
table.render({
|
||||
elem: '#ID-table-demo-templet',
|
||||
url:'/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url:'/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
page: true,
|
||||
height: '315px',
|
||||
cols: [[
|
||||
|
@ -60,4 +60,4 @@ layui.use(['table'], function(){
|
|||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
常用两级表头:
|
||||
|
||||
<table class="layui-table" lay-data="{url:'/static/2.8/json/table/demo2.json?v=2', page: true, limit: 6, limits:[6]}" id="ID-table-demo-theads-1">
|
||||
<table class="layui-table" lay-data="{url:'/static/json/2/table/demo2.json?v=2', page: true, limit: 6, limits:[6]}" id="ID-table-demo-theads-1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th lay-data="{checkbox:true}" rowspan="2"></th>
|
||||
|
@ -19,7 +19,7 @@
|
|||
|
||||
更多级表头(支持无限极):
|
||||
|
||||
<table class="layui-table" lay-data="{url:'/static/2.8/json/table/demo2.json?v=3', cellMinWidth: 80, page: true}" id="ID-table-demo-theads-2">
|
||||
<table class="layui-table" lay-data="{url:'/static/json/2/table/demo2.json?v=3', cellMinWidth: 80, page: true}" id="ID-table-demo-theads-2">
|
||||
<thead>
|
||||
<tr>
|
||||
<th lay-data="{field:'username', fixed:'left', width:80}" rowspan="3">联系人</th>
|
||||
|
@ -50,4 +50,4 @@
|
|||
</div>
|
||||
</script>
|
||||
|
||||
<!-- import layui -->
|
||||
<!-- import layui -->
|
||||
|
|
|
@ -24,13 +24,13 @@ layui.use(function(){
|
|||
// 渲染
|
||||
var inst = treeTable.render({
|
||||
elem: '#ID-treeTable-demo',
|
||||
url: '/static/2.8/json/treeTable/demo-1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/treeTable/demo-1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
tree: {
|
||||
/*
|
||||
// 异步加载子节点
|
||||
async: {
|
||||
enable: true,
|
||||
url: '/static/2.8/json/treeTable/demo-async.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
url: '/static/json/2/treeTable/demo-async.json', // 此处为静态模拟数据,实际使用时需换成真实接口
|
||||
autoParam: ["parentId=id"]
|
||||
}
|
||||
*/
|
||||
|
@ -117,4 +117,4 @@ layui.use(function(){
|
|||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
@ -5,7 +5,7 @@ toc: true
|
|||
|
||||
# 更新日志
|
||||
|
||||
<h2 class="layui-hide" lay-toc="{href: '/docs/2.8/versions.html', title: '2.8.x', hot: true}">
|
||||
<h2 class="layui-hide" lay-toc="{href: '/docs/2/versions.html', title: '2.8.x', hot: true}">
|
||||
2.8.x
|
||||
</h2>
|
||||
|
||||
|
@ -13,8 +13,8 @@ toc: true
|
|||
|
||||
|
||||
<h2 id="2.8.18" class="ws-anchor">
|
||||
2.8.18-rc.1
|
||||
<span class="layui-badge-rim">2023-10-19</span>
|
||||
2.8.18-rc.2
|
||||
<span class="layui-badge-rim">2023-10-25</span>
|
||||
</h2>
|
||||
|
||||
- #### form
|
||||
|
@ -31,6 +31,7 @@ toc: true
|
|||
- 新增 `complete` 属性,当数据接口请求完成后执行,无论成功还是失败均会触发 # 1379
|
||||
- 修复 `ignoreExport` 表头属性值效果与文档不符的问题 # I86DBY
|
||||
- #### treeTable
|
||||
- 修复 `treeTable.removeNode()` 在开启 `data` 模式时删除异常问题 # I7Z0A/I82E2S
|
||||
- 修复 `treeTable.setRowChecked()` 方法未逐层展开上级节点的问题 # 1385/I84RUT
|
||||
- #### upload
|
||||
- 修复 `unified: true` 时的报错问题 # 1391
|
||||
|
@ -53,9 +54,11 @@ toc: true
|
|||
- 优化 预览区域显示效果 # 1398
|
||||
- 优化 其他若干小问题 # 1391
|
||||
- #### 其他
|
||||
- 新增 Source Maps 支持 # 1404/I89W5P
|
||||
- 新增 lay 模块部分函数 JSDoc 注释和示例 #1401
|
||||
- 优化 `<hr>` 全局样式优先级 # I86R6G
|
||||
|
||||
### 下载: [layui-v2.8.18.rc.1.zip](https://gitee.com/layui/layui/attach_files/1558085/download)
|
||||
### 下载: [layui-v2.8.18.rc.2.zip](https://gitee.com/layui/layui/attach_files/1563717/download)
|
||||
|
||||
---
|
||||
|
||||
|
@ -488,7 +491,7 @@ toc: true
|
|||
</h2>
|
||||
|
||||
从 `2.8.0-beta.1` 到 `rc.16`,经二十个预览版的持续迭代,Layui 终于迎来了:`2.8.0` 正式版。
|
||||
<br>同时,新域名下的 [新文档站](https://layui.dev) 也正式上线(导读:[Layui 新版文档站上线初衷](./@note/2.8/news.html)),新版文档亦开源在 [Github](https://github.com/layui/layui/tree/main/docs) 以供协同维护。
|
||||
<br>同时,新域名下的 [新文档站](https://layui.dev) 也正式上线(导读:[Layui 新版文档站上线初衷](/notes/2.8/news.html)),新版文档亦开源在 [Github](https://github.com/layui/layui/tree/main/docs) 以供协同维护。
|
||||
|
||||
正是开发者们依然坚持的热爱,促使了 `Layui` 这一朴实的归来。
|
||||
|
||||
|
|
|
@ -154,25 +154,25 @@ body{padding:20px;}
|
|||
<hr>
|
||||
|
||||
赤色分割线
|
||||
<hr class="layui-bg-red">
|
||||
<hr class="layui-border-red">
|
||||
|
||||
橙色分割线
|
||||
<hr class="layui-bg-orange">
|
||||
<hr class="layui-border-orange">
|
||||
|
||||
墨绿分割线
|
||||
<hr class="layui-bg-green">
|
||||
<hr class="layui-border-green">
|
||||
|
||||
青色分割线
|
||||
<hr class="layui-bg-cyan">
|
||||
<hr class="layui-border-cyan">
|
||||
|
||||
蓝色分割线
|
||||
<hr class="layui-bg-blue">
|
||||
<hr class="layui-border-blue">
|
||||
|
||||
黑色分割线
|
||||
<hr class="layui-bg-black">
|
||||
<hr class="layui-border-black">
|
||||
|
||||
灰色分割线
|
||||
<hr class="layui-bg-gray">
|
||||
<hr class="layui-border-gray">
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -127,103 +127,94 @@
|
|||
|
||||
<div class="demo-nav-tree">
|
||||
<div class="layui-inline">
|
||||
|
||||
<ul class="layui-nav layui-nav-tree" lay-accordion lay-filter="test">
|
||||
<li class="layui-nav-item">
|
||||
<a class="" href="javascript:;">产品</a>
|
||||
<a class="" href="javascript:;">菜单 1</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">移动模块</a></dd>
|
||||
<dd>
|
||||
<a href="javascript:;">后台模版</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">组件一</a></dd>
|
||||
<dd>
|
||||
<a href="javascript:;">组件二</a>
|
||||
</dd>
|
||||
<dd><a href="javascript:;">组件三</a></dd>
|
||||
</dl>
|
||||
</dd>
|
||||
<dd><a href="javascript:;">电商平台</a></dd>
|
||||
<dd><a href="">跳转菜单</a></dd>
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">解决方案</a>
|
||||
<a href="javascript:;">菜单 2</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">移动模块</a></dd>
|
||||
<dd>
|
||||
<a href="javascript:;">后台模版</a>
|
||||
</dd>
|
||||
<dd><a href="">电商平台</a></dd>
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">云市场</a></li>
|
||||
<li class="layui-nav-item"><a href="">社区</a></li>
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">菜单 3</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">菜单 4</a></li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">菜单 5</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
|
||||
<ul class="layui-nav layui-nav-tree layui-bg-gray" lay-filter="test">
|
||||
<ul class="layui-nav layui-nav-tree layui-bg-gray" lay-filter="test">
|
||||
<li class="layui-nav-item">
|
||||
<a class="" href="javascript:;">产品</a>
|
||||
<a class="" href="javascript:;">菜单 1</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">移动模块</a></dd>
|
||||
<dd>
|
||||
<a href="javascript:;">后台模版</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">组件一</a></dd>
|
||||
<dd>
|
||||
<a href="javascript:;">组件二</a>
|
||||
</dd>
|
||||
<dd><a href="javascript:;">组件三</a></dd>
|
||||
</dl>
|
||||
</dd>
|
||||
<dd><a href="javascript:;">电商平台</a></dd>
|
||||
<dd><a href="">跳转菜单</a></dd>
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">解决方案</a>
|
||||
<a href="javascript:;">菜单 2</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">移动模块</a></dd>
|
||||
<dd>
|
||||
<a href="javascript:;">后台模版</a>
|
||||
</dd>
|
||||
<dd><a href="">电商平台</a></dd>
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">云市场</a></li>
|
||||
<li class="layui-nav-item"><a href="">社区</a></li>
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">菜单 3</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">菜单 4</a></li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">菜单 5</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
|
||||
<ul class="layui-nav layui-bg-cyan layui-nav-tree" lay-filter="test">
|
||||
<ul class="layui-nav layui-nav-tree layui-bg-black" lay-accordion lay-filter="test">
|
||||
<li class="layui-nav-item layui-nav-itemed">
|
||||
<a class="" href="javascript:;">产品</a>
|
||||
<a class="" href="javascript:;">菜单 1</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">移动模块</a></dd>
|
||||
<dd>
|
||||
<a href="javascript:;">后台模版</a>
|
||||
</dd>
|
||||
<dd><a href="javascript:;">电商平台</a></dd>
|
||||
<dd><a href="">跳转菜单</a></dd>
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">解决方案</a>
|
||||
<a href="javascript:;">菜单 2</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">移动模块</a></dd>
|
||||
<dd><a href="javascript:;">后台模版</a></dd>
|
||||
<dd><a href="">电商平台</a></dd>
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item"><a href="">云市场</a></li>
|
||||
<li class="layui-nav-item"><a href="">社区</a></li>
|
||||
<li class="layui-nav-item">
|
||||
<a href="javascript:;">菜单 3</a>
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a href="javascript:;">选项1</a></dd>
|
||||
<dd><a href="javascript:;">选项2</a></dd>
|
||||
<dd><a href="javascript:;">选项3</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">菜单 4</a></li>
|
||||
<li class="layui-nav-item"><a href="javascript:;">菜单 5</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
<button class="layui-btn" lay-on="test9">Photo</button>
|
||||
<button class="layui-btn" lay-on="test10">Drawer</button>
|
||||
<button class="layui-btn" lay-on="testTime">自动关闭</button>
|
||||
<a href="https://layui.dev/docs/2.8/layer/" target="_blank" class="layui-btn">更多例子</a>
|
||||
<a href="https://layui.dev/docs/2/layer/" target="_blank" class="layui-btn">更多例子</a>
|
||||
</div>
|
||||
|
||||
<div id="test11111" style="display: none; padding: 16px;">
|
||||
|
|
38
gulpfile.js
38
gulpfile.js
|
@ -1,5 +1,3 @@
|
|||
'use strict';
|
||||
|
||||
const pkg = require('./package.json');
|
||||
const gulp = require('gulp');
|
||||
const uglify = require('gulp-uglify');
|
||||
|
@ -9,6 +7,7 @@ const rename = require('gulp-rename');
|
|||
const replace = require('gulp-replace');
|
||||
const header = require('gulp-header');
|
||||
const footer = require('gulp-footer');
|
||||
const sourcemaps = require('gulp-sourcemaps');
|
||||
const del = require('del');
|
||||
const minimist = require('minimist');
|
||||
const yargs = require('yargs');
|
||||
|
@ -27,7 +26,7 @@ const config = {
|
|||
// 获取参数
|
||||
const argv = require('minimist')(process.argv.slice(2), {
|
||||
default: {
|
||||
version: pkg.version
|
||||
version: pkg.version
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -47,27 +46,32 @@ const js = () => {
|
|||
let src = [
|
||||
'./src/**/{layui,layui.all,'+ config.modules +'}.js'
|
||||
];
|
||||
return gulp.src(src).pipe(uglify({
|
||||
return gulp.src(src)
|
||||
.pipe(sourcemaps.init())
|
||||
.pipe(uglify({
|
||||
output: {
|
||||
ascii_only: true // escape Unicode characters in strings and regexps
|
||||
},
|
||||
ie: true
|
||||
})).pipe(concat('layui.js', {newLine: ''}))
|
||||
}))
|
||||
.pipe(concat('layui.js', {newLine: ''}))
|
||||
.pipe(header.apply(null, config.comment))
|
||||
.pipe(sourcemaps.write(''))
|
||||
.pipe(gulp.dest(dest));
|
||||
};
|
||||
|
||||
|
||||
// css
|
||||
const css = () => {
|
||||
let src = [
|
||||
'./src/css/layui.css',
|
||||
'./src/css/modules/**/*.css',
|
||||
'!./src/css/**/font.css'
|
||||
'./src/css/**/{layui,*}.css'
|
||||
];
|
||||
return gulp.src(src).pipe(cleanCSS({
|
||||
return gulp.src(src)
|
||||
.pipe(sourcemaps.init())
|
||||
.pipe(cleanCSS({
|
||||
compatibility: 'ie8'
|
||||
}))
|
||||
.pipe(concat('layui.css', {newLine: ''}))
|
||||
.pipe(sourcemaps.write(''))
|
||||
.pipe(gulp.dest(dest +'/css'));
|
||||
};
|
||||
|
||||
|
@ -80,7 +84,19 @@ const files = () => {
|
|||
|
||||
// cp
|
||||
const cp = () => {
|
||||
return gulp.src('./dist/**/*')
|
||||
const basePath = './dist/**/*';
|
||||
|
||||
// 复制 css js
|
||||
gulp.src(`${basePath}.{css,js}`)
|
||||
.pipe(replace(/\n\/(\*|\/)\#[\s\S]+$/, '')) // 过滤 css 和 js 的 map 特定注释
|
||||
.pipe(gulp.dest(dest));
|
||||
|
||||
// 复制其他文件
|
||||
return gulp.src([
|
||||
basePath,
|
||||
`!${basePath}.{css,js,map}` // 过滤 map 文件
|
||||
])
|
||||
.pipe(replace(/\n\/(\*|\/)\#[\s\S]+$/, '')) // 过滤 css 和 js 的 map 特定注释
|
||||
.pipe(gulp.dest(dest));
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "layui",
|
||||
"version": "2.8.18-rc.1",
|
||||
"version": "2.8.18-rc.2",
|
||||
"description": "Classic modular Front-End UI library",
|
||||
"main": "dist/layui.js",
|
||||
"license": "MIT",
|
||||
|
@ -19,6 +19,7 @@
|
|||
"gulp-rename": "^2.0.0",
|
||||
"gulp-header": "^2.0.9",
|
||||
"gulp-footer": "^2.1.0",
|
||||
"gulp-sourcemaps": "^3.0.0",
|
||||
"del": "^2.2.2",
|
||||
"minimist": "^1.2.8"
|
||||
},
|
||||
|
|
|
@ -636,6 +636,15 @@ a cite{font-style: normal; *cursor:pointer;}
|
|||
.layui-border-purple{border-width: 1px; border-style: solid; border-color: #a233c6!important; color: #a233c6!important;}
|
||||
.layui-border-black{border-width: 1px; border-style: solid; border-color: #2f363c!important; color: #2f363c!important;}
|
||||
|
||||
/* 分割线边框 */
|
||||
hr.layui-border-red,
|
||||
hr.layui-border-orange,
|
||||
hr.layui-border-green,
|
||||
hr.layui-border-cyan,
|
||||
hr.layui-border-blue,
|
||||
hr.layui-border-purple,
|
||||
hr.layui-border-black{border-width: 0 0 1px;}
|
||||
|
||||
/* 背景边框 */
|
||||
.layui-timeline-item:before{background-color: #eee;}
|
||||
|
||||
|
@ -1276,7 +1285,6 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh
|
|||
|
||||
.layui-nav .layui-nav-more{position: absolute; top: 0; right: 3px; left: auto !important; margin-top: 0; font-size: 12px; cursor: pointer; transition: all .2s; -webkit-transition: all .2s;}
|
||||
.layui-nav .layui-nav-mored,
|
||||
.layui-nav-expand > a .layui-nav-more,
|
||||
.layui-nav-itemed > a .layui-nav-more{transform: rotate(180deg);}
|
||||
|
||||
|
||||
|
@ -1324,12 +1332,9 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh
|
|||
/* 导航浅色背景 */
|
||||
.layui-nav.layui-bg-gray .layui-nav-item a,
|
||||
.layui-nav-tree.layui-bg-gray a{color: #373737; color: rgba(0,0,0,.8);}
|
||||
.layui-nav-tree.layui-bg-gray{padding: 6px 0;}
|
||||
.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color: #000 !important;}
|
||||
.layui-nav.layui-bg-gray .layui-this a{color: #16b777;}
|
||||
.layui-nav-tree.layui-bg-gray .layui-nav-child{padding-left: 11px; background: none;}
|
||||
.layui-nav-tree.layui-bg-gray .layui-nav-item>a{padding-top: 0; padding-bottom: 0;}
|
||||
.layui-nav-tree.layui-bg-gray .layui-nav-item>a .layui-nav-more{padding: 0;}
|
||||
.layui-nav-tree.layui-bg-gray .layui-this,
|
||||
.layui-nav-tree.layui-bg-gray .layui-this>a,
|
||||
.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
};
|
||||
|
||||
var Layui = function(){
|
||||
this.v = '2.8.18-rc.1'; // Layui 版本号
|
||||
this.v = '2.8.18-rc.2'; // Layui 版本号
|
||||
};
|
||||
|
||||
// 识别预先可能定义的指定全局对象
|
||||
|
|
|
@ -273,45 +273,62 @@ layui.define('jquery', function(exports){
|
|||
*/
|
||||
|
||||
// 点击菜单 - a 标签触发
|
||||
,clickThis: function(){
|
||||
,clickThis: function() {
|
||||
var othis = $(this);
|
||||
var parents = othis.parents(NAV_ELEM);
|
||||
var parents = othis.closest(NAV_ELEM);
|
||||
var filter = parents.attr('lay-filter');
|
||||
var parent = othis.parent() ;
|
||||
var child = othis.siblings('.'+NAV_CHILD);
|
||||
var child = othis.siblings('.'+ NAV_CHILD);
|
||||
var unselect = typeof parent.attr('lay-unselect') === 'string'; // 是否禁用选中
|
||||
|
||||
if(!(othis.attr('href') !== 'javascript:;' && othis.attr('target') === '_blank') && !unselect){
|
||||
if(!child[0]){
|
||||
parents.find('.'+THIS).removeClass(THIS);
|
||||
// 满足点击选中的条件
|
||||
if (!(othis.attr('href') !== 'javascript:;' && othis.attr('target') === '_blank') && !unselect) {
|
||||
if (!child[0]) {
|
||||
parents.find('.'+ THIS).removeClass(THIS);
|
||||
parent.addClass(THIS);
|
||||
}
|
||||
}
|
||||
|
||||
// 若为垂直菜单
|
||||
if (parents.hasClass(NAV_TREE)) {
|
||||
var NAV_ITEMED = NAV_ITEM + 'ed';
|
||||
var NAV_EXPAND = 'layui-nav-expand';
|
||||
var needExpand = !(parent.hasClass(NAV_EXPAND) || parent.hasClass(NAV_ITEMED));
|
||||
var NAV_ITEMED = NAV_ITEM + 'ed'; // 用于标注展开状态
|
||||
var needExpand = !parent.hasClass(NAV_ITEMED); // 是否执行展开
|
||||
var ANIM_MS = 200; // 动画过渡毫秒数
|
||||
|
||||
// 动画执行完成后的操作
|
||||
var complete = function() {
|
||||
$(this).css({
|
||||
"display": "" // 剔除动画生成的 style display,以适配外部样式的状态重置
|
||||
});
|
||||
// 避免导航滑块错位
|
||||
parents.children('.'+ NAV_BAR).css({
|
||||
opacity: 0
|
||||
})
|
||||
};
|
||||
|
||||
// 是否正处于动画中的状态
|
||||
if (child.is(':animated')) return;
|
||||
|
||||
// 剔除可能存在的 CSS3 动画类
|
||||
child.removeClass(NAV_ANIM);
|
||||
|
||||
// 若有子菜单,则展开
|
||||
// 若有子菜单,则对其执行展开或收缩
|
||||
if (child[0]) {
|
||||
child.stop().slideToggle(200, function() {
|
||||
needExpand || parent.removeClass(NAV_ITEMED);
|
||||
});
|
||||
parent[needExpand ? 'addClass': 'removeClass'](NAV_EXPAND);
|
||||
// 手风琴
|
||||
if(typeof parents.attr('lay-accordion') === 'string' || parents.attr('lay-shrink') === 'all'){
|
||||
// 收缩兄弟项
|
||||
parent.siblings().removeClass([
|
||||
NAV_ITEMED,
|
||||
NAV_EXPAND
|
||||
].join(' ')).children('.'+NAV_CHILD).stop().slideUp(200);
|
||||
if (needExpand) {
|
||||
// 先执行 slideDown 动画,再标注展开状态样式,避免元素 `block` 状态导致动画无效
|
||||
child.slideDown(ANIM_MS, complete);
|
||||
parent.addClass(NAV_ITEMED);
|
||||
} else {
|
||||
// 先取消展开状态样式,再将元素临时显示,避免 `none` 状态导致 slideUp 动画无效
|
||||
parent.removeClass(NAV_ITEMED);
|
||||
child.show().slideUp(ANIM_MS, complete);
|
||||
}
|
||||
|
||||
// 手风琴 --- 收缩兄弟展开项
|
||||
if (typeof parents.attr('lay-accordion') === 'string' || parents.attr('lay-shrink') === 'all') {
|
||||
var parentSibs = parent.siblings('.'+ NAV_ITEMED);
|
||||
parentSibs.removeClass(NAV_ITEMED);
|
||||
parentSibs.children('.'+ NAV_CHILD).show().stop().slideUp(ANIM_MS, complete);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -357,56 +374,65 @@ layui.define('jquery', function(exports){
|
|||
call.tabAuto.call({});
|
||||
}
|
||||
|
||||
//导航菜单
|
||||
// 导航菜单
|
||||
,nav: function(){
|
||||
var TIME = 200, timer = {}, timerMore = {}, timeEnd = {}, NAV_TITLE = 'layui-nav-title'
|
||||
var TIME = 200;
|
||||
var timer = {};
|
||||
var timerMore = {};
|
||||
var timeEnd = {};
|
||||
var NAV_TITLE = 'layui-nav-title';
|
||||
|
||||
//滑块跟随
|
||||
,follow = function(bar, nav, index){
|
||||
var othis = $(this), child = othis.find('.'+NAV_CHILD);
|
||||
if(nav.hasClass(NAV_TREE)){
|
||||
//无子菜单时跟随
|
||||
if(!child[0]){
|
||||
// 滑块跟随
|
||||
var follow = function(bar, nav, index) {
|
||||
var othis = $(this);
|
||||
var child = othis.find('.'+NAV_CHILD);
|
||||
|
||||
// 是否垂直导航菜单
|
||||
if (nav.hasClass(NAV_TREE)) {
|
||||
// 无子菜单时跟随
|
||||
if (!child[0]) {
|
||||
var thisA = othis.children('.'+ NAV_TITLE);
|
||||
bar.css({
|
||||
top: othis.offset().top - nav.offset().top
|
||||
,height: (thisA[0] ? thisA : othis).outerHeight()
|
||||
,opacity: 1
|
||||
top: othis.offset().top - nav.offset().top,
|
||||
height: (thisA[0] ? thisA : othis).outerHeight(),
|
||||
opacity: 1
|
||||
});
|
||||
}
|
||||
} else {
|
||||
child.addClass(NAV_ANIM);
|
||||
|
||||
//若居中对齐
|
||||
if(child.hasClass(NAV_CHILD_C)) child.css({
|
||||
left: -(child.outerWidth() - othis.width())/2
|
||||
});
|
||||
|
||||
//滑块定位
|
||||
if(child[0]){ //若有子菜单,则滑块消失
|
||||
bar.css({
|
||||
left: bar.position().left + bar.width()/2
|
||||
,width: 0
|
||||
,opacity: 0
|
||||
});
|
||||
} else { //bar 跟随
|
||||
bar.css({
|
||||
left: othis.position().left + parseFloat(othis.css('marginLeft'))
|
||||
,top: othis.position().top + othis.height() - bar.height()
|
||||
// 若居中对齐
|
||||
if (child.hasClass(NAV_CHILD_C)) {
|
||||
child.css({
|
||||
left: -(child.outerWidth() - othis.width()) / 2
|
||||
});
|
||||
}
|
||||
|
||||
//渐显滑块并适配宽度
|
||||
timer[index] = setTimeout(function(){
|
||||
// 滑块定位
|
||||
if (child[0]) { // 若有子菜单,则滑块消失
|
||||
bar.css({
|
||||
width: child[0] ? 0 : othis.width()
|
||||
,opacity: child[0] ? 0 : 1
|
||||
left: bar.position().left + bar.width() / 2,
|
||||
width: 0,
|
||||
opacity: 0
|
||||
});
|
||||
} else { // bar 跟随
|
||||
bar.css({
|
||||
left: othis.position().left + parseFloat(othis.css('marginLeft')),
|
||||
top: othis.position().top + othis.height() - bar.height()
|
||||
});
|
||||
}
|
||||
|
||||
// 渐显滑块并适配宽度
|
||||
timer[index] = setTimeout(function() {
|
||||
bar.css({
|
||||
width: child[0] ? 0 : othis.width(),
|
||||
opacity: child[0] ? 0 : 1
|
||||
});
|
||||
}, device.ie && device.ie < 10 ? 0 : TIME);
|
||||
|
||||
//显示子菜单
|
||||
// 显示子菜单
|
||||
clearTimeout(timeEnd[index]);
|
||||
if(child.css('display') === 'block'){
|
||||
if (child.css('display') === 'block') {
|
||||
clearTimeout(timerMore[index]);
|
||||
}
|
||||
timerMore[index] = setTimeout(function(){
|
||||
|
@ -416,61 +442,64 @@ layui.define('jquery', function(exports){
|
|||
}
|
||||
};
|
||||
|
||||
//遍历导航
|
||||
$(NAV_ELEM + elemFilter).each(function(index){
|
||||
var othis = $(this)
|
||||
,bar = $('<span class="'+ NAV_BAR +'"></span>')
|
||||
,itemElem = othis.find('.'+NAV_ITEM);
|
||||
// 遍历导航
|
||||
$(NAV_ELEM + elemFilter).each(function(index) {
|
||||
var othis = $(this);
|
||||
var bar = $('<span class="'+ NAV_BAR +'"></span>');
|
||||
var itemElem = othis.find('.'+NAV_ITEM);
|
||||
|
||||
//hover 滑动效果
|
||||
if(!othis.find('.'+NAV_BAR)[0]){
|
||||
// hover 滑动效果
|
||||
if (!othis.find('.'+NAV_BAR)[0]) {
|
||||
othis.append(bar);
|
||||
(othis.hasClass(NAV_TREE)
|
||||
( othis.hasClass(NAV_TREE)
|
||||
? itemElem.find('dd,>.'+ NAV_TITLE)
|
||||
: itemElem).on('mouseenter', function(){
|
||||
: itemElem
|
||||
).on('mouseenter', function() {
|
||||
follow.call(this, bar, othis, index);
|
||||
}).on('mouseleave', function(){ //鼠标移出
|
||||
//是否为垂直导航
|
||||
if(othis.hasClass(NAV_TREE)){
|
||||
}).on('mouseleave', function() { // 鼠标移出
|
||||
// 是否为垂直导航
|
||||
if (othis.hasClass(NAV_TREE)) {
|
||||
bar.css({
|
||||
height: 0
|
||||
,opacity: 0
|
||||
height: 0,
|
||||
opacity: 0
|
||||
});
|
||||
} else {
|
||||
//隐藏子菜单
|
||||
// 隐藏子菜单
|
||||
clearTimeout(timerMore[index]);
|
||||
timerMore[index] = setTimeout(function(){
|
||||
othis.find('.'+NAV_CHILD).removeClass(SHOW);
|
||||
othis.find('.'+NAV_MORE).removeClass(NAV_MORE+'d');
|
||||
othis.find('.'+ NAV_CHILD).removeClass(SHOW);
|
||||
othis.find('.'+ NAV_MORE).removeClass(NAV_MORE +'d');
|
||||
}, 300);
|
||||
}
|
||||
});
|
||||
othis.on('mouseleave', function(){
|
||||
|
||||
// 鼠标离开当前菜单时
|
||||
othis.on('mouseleave', function() {
|
||||
clearTimeout(timer[index])
|
||||
timeEnd[index] = setTimeout(function(){
|
||||
if(!othis.hasClass(NAV_TREE)){
|
||||
timeEnd[index] = setTimeout(function() {
|
||||
if (!othis.hasClass(NAV_TREE)) {
|
||||
bar.css({
|
||||
width: 0
|
||||
,left: bar.position().left + bar.width()/2
|
||||
,opacity: 0
|
||||
width: 0,
|
||||
left: bar.position().left + bar.width() / 2,
|
||||
opacity: 0
|
||||
});
|
||||
}
|
||||
}, TIME);
|
||||
});
|
||||
}
|
||||
|
||||
//展开子菜单
|
||||
itemElem.find('a').each(function(){
|
||||
var thisA = $(this)
|
||||
,parent = thisA.parent()
|
||||
,child = thisA.siblings('.'+NAV_CHILD);
|
||||
// 展开子菜单
|
||||
itemElem.find('a').each(function() {
|
||||
var thisA = $(this);
|
||||
var parent = thisA.parent();
|
||||
var child = thisA.siblings('.'+ NAV_CHILD);
|
||||
|
||||
//输出小箭头
|
||||
if(child[0] && !thisA.children('.'+NAV_MORE)[0]){
|
||||
// 输出小箭头
|
||||
if (child[0] && !thisA.children('.'+ NAV_MORE)[0]) {
|
||||
thisA.append('<i class="layui-icon '+ NAV_DOWN +' '+ NAV_MORE +'"></i>');
|
||||
}
|
||||
|
||||
thisA.off('click', call.clickThis).on('click', call.clickThis); //点击菜单
|
||||
thisA.off('click', call.clickThis).on('click', call.clickThis); // 点击菜单
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
var MOD_NAME = 'lay'; // 模块名
|
||||
var document = window.document;
|
||||
|
||||
// 元素查找
|
||||
/**
|
||||
* 元素查找
|
||||
* @param {string | HTMLElement | JQuery} selector
|
||||
*/
|
||||
var lay = function(selector){
|
||||
return new Class(selector);
|
||||
};
|
||||
|
@ -49,8 +52,15 @@
|
|||
|
||||
Class.fn = Class.prototype = [];
|
||||
Class.fn.constructor = Class;
|
||||
|
||||
// 普通对象深度扩展
|
||||
|
||||
/**
|
||||
* 将两个或多个对象的内容深度合并到第一个对象中
|
||||
* @callback ExtendFunc
|
||||
* @param {*} target - 一个对象
|
||||
* @param {...*} objectN - 包含额外的属性合并到第一个参数
|
||||
* @returns {*} 返回合并后的对象
|
||||
*/
|
||||
/** @type ExtendFunc*/
|
||||
lay.extend = function(){
|
||||
var ai = 1;
|
||||
var length;
|
||||
|
@ -77,7 +87,10 @@
|
|||
return args[0];
|
||||
};
|
||||
|
||||
// ie 版本
|
||||
/**
|
||||
* IE 版本
|
||||
* @type {string | boolean} - 如果是 IE 返回版本字符串,否则返回 false
|
||||
*/
|
||||
lay.ie = function(){
|
||||
var agent = navigator.userAgent.toLowerCase();
|
||||
return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
|
||||
|
@ -98,8 +111,18 @@
|
|||
return this;
|
||||
};
|
||||
|
||||
|
||||
// 数字前置补零
|
||||
|
||||
/**
|
||||
* 数字前置补零
|
||||
* @param {number | string} num - 原始数字
|
||||
* @param {number} [length=2] - 数字长度,如果原始数字长度小于 length,则前面补零
|
||||
* @returns {string} 返回补 0 后的数字
|
||||
* @example
|
||||
* ```js
|
||||
* lay.digit(6, 2); // "06"
|
||||
* lay.digit('7', 3); // "007"
|
||||
* ```
|
||||
*/
|
||||
lay.digit = function(num, length){
|
||||
if(!(typeof num === 'string' || typeof num === 'number')) return '';
|
||||
|
||||
|
@ -112,7 +135,16 @@
|
|||
return num < Math.pow(10, length) ? str + num : num;
|
||||
};
|
||||
|
||||
// 创建元素
|
||||
/**
|
||||
* 创建元素
|
||||
* @param {string} elemName - 元素的标签名
|
||||
* @param {{attrName: string, attrValue:string}} [attr] - 添加到元素上的属性
|
||||
* @returns {HTMLElement} 返回创建的 HTML 元素
|
||||
* @example
|
||||
* ```js
|
||||
* lay.elem('div', {id: 'test'}) // <div id="test"></div>
|
||||
* ```
|
||||
*/
|
||||
lay.elem = function(elemName, attr){
|
||||
var elem = document.createElement(elemName);
|
||||
lay.each(attr || {}, function(key, value){
|
||||
|
@ -121,12 +153,43 @@
|
|||
return elem;
|
||||
};
|
||||
|
||||
// 当前页面是否存在滚动条
|
||||
/**
|
||||
* 当前页面是否存在滚动条
|
||||
* @returns {boolean} 是否存在滚动条
|
||||
* @example
|
||||
* ```
|
||||
* lay.hasScrollbar() // true 或 false
|
||||
* ```
|
||||
*/
|
||||
lay.hasScrollbar = function(){
|
||||
return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
|
||||
};
|
||||
|
||||
// 获取 style rules
|
||||
/**
|
||||
* 获取 style rules
|
||||
* @param {HTMLStyleElement} style - HTMLStyle 元素
|
||||
* @param {(ruleItem: CSSStyleRule, index: number) => boolean} [callback] - 用来返回 style 元素中的每个 `style rule` 的函数,返回 true 终止遍历
|
||||
* @returns {CSSRuleList } 返回 `style rules`
|
||||
* @example
|
||||
* ```
|
||||
* <style id="test">
|
||||
* .lay-card{
|
||||
* color: #000;
|
||||
* }
|
||||
* .lay-btn-success{
|
||||
* color: green;
|
||||
* }
|
||||
* </style>
|
||||
*
|
||||
* lay.getStyleRules($('#test')[0], function(rule, index){
|
||||
* if(rule.selectorText === '.lay-card'){
|
||||
* console.log(index, rule.cssText) // 0 '.lay-card{color: #000}'
|
||||
* rule.style.color = '#EEE';
|
||||
* return true; // 终止遍历
|
||||
* }
|
||||
* }) // RuleList
|
||||
* ```
|
||||
*/
|
||||
lay.getStyleRules = function(style, callback) {
|
||||
if (!style) return;
|
||||
|
||||
|
@ -142,7 +205,26 @@
|
|||
return rules;
|
||||
};
|
||||
|
||||
// 创建 style 样式
|
||||
/**
|
||||
* 创建 style 样式
|
||||
* @param {Object} options - 可配置的选项
|
||||
* @param {string | HTMLElement | JQuery} [options.target] - 目标容器,指定后会将样式追加到目标容器
|
||||
* @param {string} [options.id] - 样式元素的 id,默认自增
|
||||
* @param {string} options.text - 样式内容
|
||||
* @returns {HTMLStyleElement} 返回创建的样式元素
|
||||
* @example
|
||||
* ```html
|
||||
* <div id="targetEl">
|
||||
* <!-- 样式追加到目标容器 -->
|
||||
* <style id="LAY-STYLE-DF-0">.card{color: #000}</style>
|
||||
* </div>
|
||||
*
|
||||
* lay.style({
|
||||
* target: '#targetEl',
|
||||
* text: '.card{color: #000}'
|
||||
* }) // <style id="LAY-STYLE-DF-0">.card{color: #000}</style>
|
||||
* ```
|
||||
*/
|
||||
lay.style = function(options){
|
||||
options = options || {};
|
||||
|
||||
|
@ -176,7 +258,37 @@
|
|||
return style;
|
||||
};
|
||||
|
||||
// 元素定位
|
||||
/**
|
||||
* 将元素定位到指定目标元素附近
|
||||
* @param {HTMLElement} target - 目标元素
|
||||
* @param {HTMLElement} elem - 定位元素
|
||||
* @param {Object} [opts] - 可配置的选项
|
||||
* @param {'absolute' | 'fixed'} [opts.position] - 元素的定位类型
|
||||
* @param {'left' | 'right'} [opts.clickType="left"] - 点击类型,默认为 'left',如果 {@link target} 是 document 或 body 元素,则为 'right'
|
||||
* @param {'left' | 'right' | 'center'} [opts.align="left"] - 对齐方式
|
||||
* @param {boolean} [opts.allowBottomOut=false] - 顶部没有足够区域显示时,是否允许底部溢出
|
||||
* @param {string | number} [opts.margin=5] - 边距
|
||||
* @param {Event} [opts.e] - 事件对象,仅右键生效
|
||||
* @param {boolean} [opts.SYSTEM_RELOAD] - 是否重载,用于出现滚动条时重新计算位置
|
||||
* @example
|
||||
* ```js
|
||||
* <button id="targetEl">dropdown</button>
|
||||
* <ul id="contentEl" class="dropdown-menu">
|
||||
* <li>菜单1</li>
|
||||
* <li>菜单2</li>
|
||||
* </ul>
|
||||
*
|
||||
* // 下拉菜单将被定位到按钮附近
|
||||
* lay.position(
|
||||
* $('#targetEl')[0],
|
||||
* $('#contentEl')[0],
|
||||
* {
|
||||
* position: 'fixed',
|
||||
* align: 'center'
|
||||
* }
|
||||
* )
|
||||
* ```
|
||||
*/
|
||||
lay.position = function(target, elem, opts){
|
||||
if(!elem) return;
|
||||
opts = opts || {};
|
||||
|
@ -276,7 +388,25 @@
|
|||
}
|
||||
};
|
||||
|
||||
// 获取元素上的属性配置项
|
||||
/**
|
||||
* 获取元素上的属性配置项
|
||||
* @param {string | HTMLElement | JQuery} elem - HTML 元素
|
||||
* @param {{attr: string} | string} [opts="lay-options"] - 可配置的选项,string 类型指定属性名
|
||||
* @returns {*} 返回元素上的属性配置项
|
||||
* @example
|
||||
* ```js
|
||||
* <div id="testEl" lay-options="{color:red}" lay-toc="{hot: true}"></div>
|
||||
*
|
||||
* var elem = $('#testEl')
|
||||
* lay.options(elem) // {color:red}
|
||||
* lay.options(elem[0]) // {color:red}
|
||||
* lay.options('#testEl') // {color:red}
|
||||
* lay.options('#testEl', {attr: 'lay-toc'}) // {hot: true}
|
||||
* lay.options('#testEl', 'lay-toc') // {hot: true}
|
||||
*
|
||||
* $('#testEl').attr('lay-toc') // '{hot: true}'
|
||||
* ```
|
||||
*/
|
||||
lay.options = function(elem, opts){
|
||||
opts = typeof opts === 'object' ? opts : {attr: opts};
|
||||
|
||||
|
@ -297,7 +427,16 @@
|
|||
}
|
||||
};
|
||||
|
||||
// 元素是否属于顶级元素(document 或 body)
|
||||
|
||||
/**
|
||||
* 元素是否属于顶级元素(document 或 body)
|
||||
* @param {HTMLElement} elem - HTML 元素
|
||||
* @returns {boolean} 是否属于顶级元素
|
||||
* @example
|
||||
* ```js
|
||||
* lay.isTopElem(document) // true
|
||||
* ```
|
||||
*/
|
||||
lay.isTopElem = function(elem){
|
||||
var topElems = [document, lay('body')[0]]
|
||||
,matched = false;
|
||||
|
@ -311,7 +450,21 @@
|
|||
|
||||
// 剪切板
|
||||
lay.clipboard = {
|
||||
// 写入文本
|
||||
/**
|
||||
* 写入文本
|
||||
* @param {Object} options - 可配置的选项
|
||||
* @param {string} options.text - 写入剪贴板的文本
|
||||
* @param {() => void} [options.done] - 写入成功/完成回调
|
||||
* @param {(err?: any) => void} [options.error] - 写入失败回调
|
||||
* @example
|
||||
* ```js
|
||||
* lay.clipboard.writeText({
|
||||
* text: '测试文本',
|
||||
* done: function(){ layer.msg('copied')},
|
||||
* error: function(){ layer.msg('error')}
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
writeText: function(options) {
|
||||
var text = String(options.text);
|
||||
|
||||
|
|
|
@ -421,45 +421,48 @@ layui.define(['table'], function (exports) {
|
|||
return;
|
||||
}
|
||||
|
||||
// 用index
|
||||
// 用 index
|
||||
return that.getNodeByIndex(dataIndex);
|
||||
}
|
||||
|
||||
// 通过index获取节点数据
|
||||
// 通过 index 获取节点数据
|
||||
Class.prototype.getNodeDataByIndex = function (index, clone, newValue) {
|
||||
var that = this;
|
||||
var options = that.getOptions();
|
||||
var treeOptions = options.tree;
|
||||
var tableId = options.id;
|
||||
var tableCache = table.cache[tableId];
|
||||
|
||||
var dataCache = table.cache[tableId][index];
|
||||
// 获取当前行中的数据
|
||||
var dataCache = tableCache[index];
|
||||
|
||||
// 若非删除操作,则返回合并后的数据
|
||||
if (newValue !== 'delete' && dataCache) {
|
||||
$.extend(dataCache, newValue);
|
||||
return clone ? $.extend({}, dataCache) : dataCache;
|
||||
}
|
||||
|
||||
var tableData = that.getTableData();
|
||||
index += '';
|
||||
var indexArr = index.split('-');
|
||||
// 删除操作
|
||||
var dataRet = tableCache;
|
||||
var indexArr = String(index).split('-');
|
||||
|
||||
var dataRet = tableData;
|
||||
var tableCache = (options.url || indexArr.length > 1) ? null : table.cache[tableId]; // 只有在删除根节点的时候才需要处理
|
||||
// if (options.url || indexArr.length > 1) tableCache = null // 只有在删除根节点的时候才需要处理
|
||||
|
||||
// 根据 index 进行数据处理
|
||||
for (var i = 0, childrenKey = treeOptions.customName.children; i < indexArr.length; i++) {
|
||||
if (newValue && i === indexArr.length - 1) {
|
||||
if (newValue === 'delete') {
|
||||
// 删除
|
||||
if (tableCache) {
|
||||
// 同步cache
|
||||
if (newValue === 'delete') { // 删除并返回当前数据
|
||||
// 同步 cache --- 此段代码注释缘由:data 属性模式造成数据重复执行 splice (@Gitee: #I7Z0A/I82E2S)
|
||||
/*if (tableCache) {
|
||||
layui.each(tableCache, function (i1, item1) {
|
||||
if (item1[LAY_DATA_INDEX] === index) {
|
||||
tableCache.splice(i1, 1);
|
||||
return true;
|
||||
}
|
||||
})
|
||||
}
|
||||
}*/
|
||||
return (i ? dataRet[childrenKey] : dataRet).splice(indexArr[i], 1)[0];
|
||||
} else {
|
||||
// 更新值
|
||||
} else { // 更新值
|
||||
$.extend((i ? dataRet[childrenKey] : dataRet)[indexArr[i]], newValue);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue