mirror of https://github.com/layui/layui
Merge branch 'layui:2.x' into 2.x
commit
063614536f
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -109,7 +109,7 @@ npm i layui
|
|||
|
||||
点击上方 `Preview` 标签可进行效果预览。
|
||||
|
||||
<h2 id="help" lay-toc="{}">其他帮助</h2>
|
||||
<h2 id="help">其他帮助</h2>
|
||||
|
||||
- <a href="https://codepen.io/layui/pen/bGxZXrd" target="_blank" rel="nofollow">在线测试</a>
|
||||
- <a href="https://github.com/Sight-wcg/layui-theme-dark" target="_blank">深色主题</a> (社区贡献)
|
||||
|
|
|
@ -205,7 +205,7 @@ table.render({
|
|||
</tr>
|
||||
<tr>
|
||||
<td>exportTemplet <sup>2.6.9+</sup></td>
|
||||
<td>
|
||||
<td colspan="3">
|
||||
|
||||
<div class="ws-anchor" id="cols.exportTemplet">
|
||||
|
||||
|
@ -223,8 +223,6 @@ exportTemplet: function(d, obj){
|
|||
```
|
||||
|
||||
</td>
|
||||
<td>string<br>function</td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -232,21 +230,31 @@ exportTemplet: function(d, obj){
|
|||
[totalRow](#cols.totalRow)
|
||||
|
||||
</td>
|
||||
<td>
|
||||
<td colspan="3">
|
||||
|
||||
<div class="ws-anchor" id="cols.totalRow">
|
||||
是否开启该列的自动合计功能。
|
||||
是否开启该列的自动合计功能,默认不开启。
|
||||
</div>
|
||||
|
||||
- 前端合计
|
||||
- **采用前端合计**
|
||||
|
||||
{{!
|
||||
```
|
||||
totalRow: true // 开启合计行,并默认对当前所有行数据进行前端合计
|
||||
// 开启并输出合计行前端合计结果
|
||||
totalRow: true
|
||||
|
||||
// 开启并输出合计行自定义模板。此处 TOTAL_NUMS 即为合计结果的固定特定字段
|
||||
totalRow: '{{= d.TOTAL_NUMS }} 单位'
|
||||
// 取整或其他运算
|
||||
totalRow: '{{= parseInt(d.TOTAL_NUMS) }}'
|
||||
```
|
||||
!}}
|
||||
|
||||
- 后端合计
|
||||
注意:*合计行模板仅支持字符写法,不支持函数写法,请勿与 `templet` 用法混淆。*
|
||||
|
||||
前端合计的数据有限,因此常常需要后端直接返回合计行结果,此时将优先读取后端的合计行返回结果,其格式如下:
|
||||
- **采用后端合计**
|
||||
|
||||
前端合计的数据有限,因此常需要后端直接返回合计结果,组件将优先读取。数据格式如下:
|
||||
|
||||
```
|
||||
{
|
||||
|
@ -261,26 +269,18 @@ totalRow: true // 开启合计行,并默认对当前所有行数据进行前
|
|||
}
|
||||
```
|
||||
|
||||
如上,在 `totalRow` 中返回所需统计的列字段名和值即可。
|
||||
<br>`totalRow` 字段同样可以通过 `parseData` 回调来解析成为 table 组件所规定的数据格式。
|
||||
|
||||
|
||||
- 合计行模板
|
||||
在合计行自定义模板中输出后端返回的合计数据
|
||||
|
||||
{{!
|
||||
```
|
||||
// 获取前端统计的动态字段
|
||||
totalRow: '{{= d.TOTAL_NUMS }} 单位' // 还比如只取整:'{{= parseInt(d.TOTAL_NUMS) }}'
|
||||
// 获取返回数据中的统计字段
|
||||
totalRow: '分数:{{= d.TOTAL_ROW.score }}' // TOTAL_ROW 即对应返回据中的 totalRow
|
||||
// 获取后端接口返回数据中的统计字段。此处 TOTAL_ROW 即对应返回据中的 totalRow
|
||||
totalRow: '分数:{{= d.TOTAL_ROW.score }}'
|
||||
```
|
||||
!}}
|
||||
|
||||
</td>
|
||||
<td>boolean<br>string</td>
|
||||
<td>
|
||||
|
||||
`false`
|
||||
如上,在 `totalRow` 中返回所需统计的列字段名和值即可。
|
||||
`totalRow` 字段同样可以通过 `parseData` 回调来解析成为 table 组件所规定的数据格式。
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -26,6 +26,7 @@ layui.use(function(){
|
|||
elem: '#ID-tree-demo',
|
||||
data: data,
|
||||
showCheckbox: true, // 是否显示复选框
|
||||
onlyIconControl: true, // 是否仅允许节点左侧图标控制展开收缩
|
||||
id: 'demo-id-1',
|
||||
isJump: true, // 是否允许点击节点时弹出新窗口跳转
|
||||
click: function(obj){
|
||||
|
|
|
@ -6,6 +6,7 @@ toc: true
|
|||
# 树表组件 <sup title="指在该版本新增的组件">2.8+</sup>
|
||||
|
||||
> 树表组件 `treeTable` 是基于 `table` 组件延伸的树形表格组件,支持常见的树组件功能。
|
||||
> 注意:*该组件不支持 IE8*
|
||||
|
||||
<h2 id="examples" lay-toc="{anchor: null}" style="margin-bottom: 0;">示例</h2>
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ toc: true
|
|||
| [util.fixbar(options)](../fixbar/) | 固定条组件 |
|
||||
| [util.countdown(options)](#countdown) | 倒计时组件 |
|
||||
| [util.timeAgo(time, onlyDate)](#timeAgo) | 某个时间在多久前 |
|
||||
| [util.toDateString(time, format)](#toDateString) | 将毫秒数或日期对象转换成日期格式字符 |
|
||||
| [util.toDateString(time, format, options)](#toDateString) | 将毫秒数或日期对象转换成日期格式字符 |
|
||||
| [util.digit(num, length)](#digit) | 数字前置补零 |
|
||||
| [util.escape(str)](#escape) | 转义 HTML 字符 |
|
||||
| [util.unescape(str)](#escape) | 还原 HTML 字符 |
|
||||
|
@ -97,15 +97,57 @@ var result = util.timeAgo(1672531200000); // 2023-01-01 00:00:00
|
|||
|
||||
<h3 id="toDateString" class="ws-anchor ws-bold">转换日期格式字符</h3>
|
||||
|
||||
`var result = util.toDateString(time, format);`
|
||||
`var result = util.toDateString(time, format, options);`
|
||||
|
||||
- 参数 `time` : 毫秒数或日期对象
|
||||
- 参数 `format` : 日期字符格式。默认格式:`yyyy-MM-dd HH:mm:ss` 。可自定义,如: `yyyy年MM月dd日`
|
||||
- 参数 `options` <sup>2.8.13+</sup> : 该方法的属性可选项,详见下表:
|
||||
|
||||
| 属性名 | 描述 | 类型 | 默认值 |
|
||||
| --- | --- | --- | --- |
|
||||
| customMeridiem | 自定义 meridiem 格式 | Function | - |
|
||||
|
||||
```
|
||||
var result = util.toDateString(1672531200000, 'yyyy-MM-dd'); // 2023-01-01
|
||||
|
||||
// 中括号中的字符会原样保留 2.8.13+
|
||||
var result2 = util.toDateString(new Date('2023-01-01 11:35:25'), 'ss[s]'); // 25s
|
||||
|
||||
// 自定义 meridiem
|
||||
var result3 = util.toDateString(
|
||||
'2023-01-01 11:35:25',
|
||||
'hh:mm:ss A',
|
||||
{
|
||||
customMeridiem: function(hours, minutes){
|
||||
return (hours < 12 ? 'AM' : 'PM')
|
||||
//.split('').join('.') // 有句点,A.M.
|
||||
//.toLowerCase() // 小写,a.m.
|
||||
}
|
||||
}
|
||||
); // 11:35:25 AM
|
||||
```
|
||||
|
||||
参数 `format` 所有可用的格式列表 :
|
||||
|
||||
| 格式 | 示例 | 描述 |
|
||||
| --- | --- | --- |
|
||||
| yy <sup>2.8.13+</sup> | 23 | 年,两位数 |
|
||||
| yyyy | 2023 | 年,四位数 |
|
||||
| M <sup>2.8.13+</sup> | 1-12 | 月 |
|
||||
| MM | 01-12 | 月,两位数 |
|
||||
| d <sup>2.8.13+</sup> | 1-31 | 日 |
|
||||
| dd | 01-31 | 日,两位数 |
|
||||
| H <sup>2.8.13+</sup> | 0-23 | 小时 |
|
||||
| HH | 00-23 | 小时,两位数 |
|
||||
| h <sup>2.8.13+</sup> | 1-12 | 小时,12 小时制 |
|
||||
| hh <sup>2.8.13+</sup> | 01-12 | 小时,12 小时制,两位数 |
|
||||
| A <sup>2.8.13+</sup> | 凌晨/早上/上午/中午/下午/晚上 | meridiem |
|
||||
| m <sup>2.8.13+</sup> | 0-59 | 分钟 |
|
||||
| mm | 00-59 | 分钟,两位数 |
|
||||
| s <sup>2.8.13+</sup> | 0-59 | 秒 |
|
||||
| ss | 00-59 | 秒,两位数 |
|
||||
| SSS <sup>2.8.13+</sup> | 000-999 | 毫秒,三位数 |
|
||||
|
||||
<h3 id="digit" class="ws-anchor ws-bold">数字前置补零</h3>
|
||||
|
||||
`util.digit(num, length);`
|
||||
|
|
|
@ -11,6 +11,31 @@ toc: true
|
|||
|
||||
> 导读:📑 [Layui 2.8 《升级指南》](/notes/2.8/upgrade-guide.html) · 📑 [Layui 新版文档站上线初衷](/notes/2.8/news.html)
|
||||
|
||||
|
||||
<h2 id="2.8.13" class="ws-anchor">
|
||||
2.8.13
|
||||
<span class="layui-badge-rim">2023-08-08</span>
|
||||
</h2>
|
||||
|
||||
- #### table
|
||||
- 优化 在自定义模板中放置 `checkbox` 时对应的文字显示异常问题 # I7LQNO
|
||||
- 调整 `totalRow` 属性在 `table.reloadData()` 数据重载时的支持 # I7R6VY
|
||||
- #### treeTable
|
||||
- 修复 执行 `treeTable.addNodes()` 增加节点导致当前节点选中状态丢失的问题 # I7Q6IP
|
||||
- 优化 增加和删除节点时,对容器尺寸重新进行自动适配
|
||||
- #### tree
|
||||
- 优化 容器样式,以解决用于其他组件内部可能造成的样式异常问题 # I7QAO3
|
||||
- #### dropdown
|
||||
- **调整** `data.title` 属性对 HTML 的转义处理。若不转义,可通过 `templet` 属性实现 # I7Q6IV
|
||||
- #### util
|
||||
- 重构 `util.toDateString()` 转换日期格式字符组件,以提供更强大的占位符支持 # 1314
|
||||
- 修复 `util.fixbar()` 组件因 `default` 属性在 IE8 出现的保留字报错问题
|
||||
|
||||
### 下载: [layui-v2.8.13.zip](https://gitee.com/layui/layui/attach_files/1490273/download)
|
||||
|
||||
---
|
||||
|
||||
|
||||
<h2 id="2.8.12" class="ws-anchor">
|
||||
2.8.12
|
||||
<span class="layui-badge-rim">2023-08-01</span>
|
||||
|
|
|
@ -46,18 +46,18 @@ layui.use('dropdown', function(){
|
|||
//,align: 'right'
|
||||
,data: [{
|
||||
title: 'menu item 1'
|
||||
,templet: '<i class="layui-icon layui-icon-light"></i> {{d.title}} <span class="layui-badge-dot"></span>'
|
||||
,templet: '<i class="layui-icon layui-icon-light"></i> {{= d.title }} <span class="layui-badge-dot"></span>'
|
||||
,id: ''
|
||||
,href: ''
|
||||
,type: '' //菜单类型,支持:normal/group/parent
|
||||
},{
|
||||
title: 'menu item 2'
|
||||
,templet: '<img src="//cdn.layui.com/avatar/168.jpg?t=123" style="width: 16px;"> {{d.title}}'
|
||||
title: 'menu item <strong>2</strong>'
|
||||
,templet: '<img src="https://unpkg.com/outeres@0.1.1/demo/avatar/0.png" style="width: 16px;"> {{- d.title }}'
|
||||
,id: ''
|
||||
,href: 'https://www.layui.com/'
|
||||
,target: '_blank'
|
||||
},{type: '-'},{},{
|
||||
title: 'menu item 3'
|
||||
title: 'menu item 3 <hello>'
|
||||
,id: ''
|
||||
,type: 'group'
|
||||
,child: [{
|
||||
|
|
|
@ -29,6 +29,14 @@ body{padding: 50px;}
|
|||
|
||||
<hr>
|
||||
|
||||
请编辑格式:
|
||||
<div class="layui-inline">
|
||||
<input type="text" value="yyyy-MM-dd HH:mm:ss" class="layui-input" id="test2"/>
|
||||
</div>
|
||||
<span class="layui-word-aux" id="test3"></span>
|
||||
|
||||
<hr>
|
||||
|
||||
<div id="target-test" style1="position: relative; height: 300px; overflow: auto;">
|
||||
1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>
|
||||
</div>
|
||||
|
@ -121,6 +129,16 @@ layui.use(['util', 'layer'], function(){
|
|||
alert(othis.html())
|
||||
}
|
||||
});
|
||||
|
||||
// 转换日期格式
|
||||
var timer = null
|
||||
var toDateString = function (format) {
|
||||
var dateString = util.toDateString(new Date(), format);
|
||||
$('#test3').html(dateString)
|
||||
}
|
||||
timer = setInterval(() => {
|
||||
toDateString($('#test2').val())
|
||||
}, 50)
|
||||
|
||||
});
|
||||
</script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "layui",
|
||||
"version": "2.8.12",
|
||||
"version": "2.8.13",
|
||||
"description": "Classic modular Front-End UI library",
|
||||
"main": "dist/layui.js",
|
||||
"license": "MIT",
|
||||
|
|
|
@ -1071,6 +1071,7 @@ a cite{font-style: normal; *cursor:pointer;}
|
|||
|
||||
.layui-table-cell{height: 38px; line-height: 28px; padding: 6px 15px; position: relative; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; box-sizing: border-box;}
|
||||
.layui-table-cell .layui-form-checkbox[lay-skin="primary"]{top: -1px; padding: 0;}
|
||||
.layui-table-cell .layui-form-checkbox[lay-skin="primary"] > div{padding-left: 24px;}
|
||||
.layui-table-cell .layui-table-link{color: #01AAED;}
|
||||
.layui-table-cell .layui-btn{vertical-align: inherit;}
|
||||
.layui-table-cell[align="center"]{-webkit-box-pack: center;}
|
||||
|
@ -1550,7 +1551,7 @@ body .layui-util-face .layui-layer-content{padding:0; background-color:#fff; co
|
|||
.layui-tree-pack{display: none; padding-left: 20px; position: relative;}
|
||||
.layui-tree-line .layui-tree-pack{padding-left: 27px;}
|
||||
.layui-tree-line .layui-tree-set .layui-tree-set:after{content: ""; position: absolute; top: 14px; left: -9px; width: 17px; height: 0; border-top: 1px dotted #c0c4cc;}
|
||||
.layui-tree-entry{position: relative; padding: 3px 0; height: 20px; white-space: nowrap;}
|
||||
.layui-tree-entry{position: relative; padding: 3px 0; height: 26px; white-space: nowrap;}
|
||||
.layui-tree-entry:hover{background-color: #eee;}
|
||||
.layui-tree-line .layui-tree-entry:hover{background-color: rgba(0,0,0,0);}
|
||||
.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color: #999; text-decoration: underline; transition: 0.3s;}
|
||||
|
@ -1559,7 +1560,7 @@ body .layui-util-face .layui-layer-content{padding:0; background-color:#fff; co
|
|||
.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height: 13px;}
|
||||
.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height: 0;}
|
||||
.layui-tree-iconClick{display: inline-block; vertical-align: middle; position: relative; height: 20px; line-height: 20px; margin: 0 10px; color: #c0c4cc;}
|
||||
.layui-tree-icon{height: 12px; line-height: 12px; width: 12px; text-align: center; border: 1px solid #c0c4cc;}
|
||||
.layui-tree-icon{height: 14px; line-height: 12px; width: 14px; text-align: center; border: 1px solid #c0c4cc;}
|
||||
.layui-tree-iconClick .layui-icon{font-size: 18px;}
|
||||
.layui-tree-icon .layui-icon{font-size: 12px; color: #5F5F5F;}
|
||||
.layui-tree-iconArrow{padding: 0 5px;}
|
||||
|
@ -1571,7 +1572,7 @@ body .layui-util-face .layui-layer-content{padding:0; background-color:#fff; co
|
|||
.layui-tree-btnGroup .layui-icon{display: inline-block; vertical-align: middle; padding: 0 2px; cursor: pointer;}
|
||||
.layui-tree-btnGroup .layui-icon:hover{color: #999; transition: 0.3s;}
|
||||
.layui-tree-entry:hover .layui-tree-btnGroup{visibility: visible;}
|
||||
.layui-tree-editInput{position: relative; display: inline-block; vertical-align: middle; height: 20px; line-height: 20px; padding: 0 3px; border: none; background-color: rgba(0,0,0,0.05);}
|
||||
.layui-tree-editInput{position: relative; display: inline-block; vertical-align: middle; height: 20px; line-height: 20px; padding: 0; border: none; background-color: rgba(0,0,0,0.05);}
|
||||
.layui-tree-emptyText{text-align: center; color: #999;}
|
||||
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
};
|
||||
|
||||
var Layui = function(){
|
||||
this.v = '2.8.12'; // Layui 版本号
|
||||
this.v = '2.8.13'; // Layui 版本号
|
||||
};
|
||||
|
||||
// 识别预先可能定义的指定全局对象
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
layui.define(function(){
|
||||
var mods = []
|
||||
,builtin = layui.cache.builtin;
|
||||
var builtin = layui.cache.builtin;
|
||||
|
||||
layui.each(builtin, function(modName){
|
||||
(modName === 'all' || modName === 'layui.all') || mods.push(modName);
|
||||
});
|
||||
|
@ -15,12 +16,12 @@ layui.define(function(){
|
|||
}(), function(exports){
|
||||
"use strict";
|
||||
|
||||
var MOD_NAME = 'all'
|
||||
var MOD_NAME = 'all';
|
||||
|
||||
//外部接口
|
||||
,all = {
|
||||
config: {}
|
||||
,time: function(){
|
||||
// 外部接口
|
||||
var all = {
|
||||
config: {},
|
||||
time: function(){
|
||||
var time = new Date().getTime() - layui.cache.startTime;
|
||||
delete layui.cache.startTime;
|
||||
return time;
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
* 下拉菜单组件
|
||||
*/
|
||||
|
||||
layui.define(['jquery', 'laytpl', 'lay'], function(exports){
|
||||
layui.define(['jquery', 'laytpl', 'lay', 'util'], function(exports){
|
||||
"use strict";
|
||||
|
||||
var $ = layui.$;
|
||||
var laytpl = layui.laytpl;
|
||||
var util = layui.util;
|
||||
var hint = layui.hint();
|
||||
var device = layui.device();
|
||||
var clickOrMousedown = (device.mobile ? 'touchstart' : 'mousedown');
|
||||
|
@ -175,7 +176,7 @@ layui.define(['jquery', 'laytpl', 'lay'], function(exports){
|
|||
: laytpl(templet).render(item);
|
||||
}
|
||||
return title;
|
||||
}(item.title);
|
||||
}(util.escape(item.title));
|
||||
|
||||
// 初始类型
|
||||
var type = function(){
|
||||
|
|
|
@ -2882,7 +2882,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
|
|||
var dataParams = new RegExp('^('+ [
|
||||
'elem', 'id', 'cols', 'width', 'height', 'maxHeight',
|
||||
'toolbar', 'defaultToolbar',
|
||||
'className', 'css', 'totalRow', 'pagebar'
|
||||
'className', 'css', 'pagebar'
|
||||
].join('|') + ')$');
|
||||
|
||||
// 过滤与数据无关的参数
|
||||
|
|
|
@ -125,7 +125,7 @@ layui.define('form', function(exports){
|
|||
|
||||
that.checkids = [];
|
||||
|
||||
var temp = $('<div class="layui-tree'+ (options.showCheckbox ? " layui-form" : "") + (options.showLine ? " layui-tree-line" : "") +'" lay-filter="LAY-tree-'+ that.index +'"></div>');
|
||||
var temp = $('<div class="layui-tree layui-border-box'+ (options.showCheckbox ? " layui-form" : "") + (options.showLine ? " layui-tree-line" : "") +'" lay-filter="LAY-tree-'+ that.index +'"></div>');
|
||||
that.tree(temp);
|
||||
|
||||
var othis = options.elem = $(options.elem);
|
||||
|
|
|
@ -1243,6 +1243,9 @@ layui.define(['table'], function (exports) {
|
|||
tableView.find('tr[data-level="0"][lay-data-index="' + item4[LAY_DATA_INDEX] + '"]').attr('data-index', i4);
|
||||
})
|
||||
options.hasNumberCol && formatNumber(that);
|
||||
|
||||
// 重新适配尺寸
|
||||
table.resize(id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1262,6 +1265,7 @@ layui.define(['table'], function (exports) {
|
|||
var options = that.getOptions();
|
||||
var treeOptions = options.tree;
|
||||
var tableViewElem = options.elem.next();
|
||||
var checkName = table.config.checkName;
|
||||
|
||||
opts = opts || {};
|
||||
|
||||
|
@ -1277,6 +1281,13 @@ layui.define(['table'], function (exports) {
|
|||
// 添加数据
|
||||
newNodes = $.extend(true, [], (layui.isArray(newNodes) ? newNodes : [newNodes]));
|
||||
|
||||
// 若未传入 LAY_CHECKED 属性,则继承父节点的 checked 状态
|
||||
layui.each(newNodes, function(i, item){
|
||||
if(!(checkName in item)){
|
||||
item[checkName] = parentNode[checkName];
|
||||
}
|
||||
})
|
||||
|
||||
var tableData = that.getTableData(), dataAfter;
|
||||
if (!parentNode) {
|
||||
// 添加到根节点
|
||||
|
@ -1384,6 +1395,10 @@ layui.define(['table'], function (exports) {
|
|||
// 滚动到第一个新增的节点
|
||||
tableViewElem.find(ELEM_MAIN).find('tr[lay-data-index="' + newNodes[0][LAY_DATA_INDEX] + '"]').get(0).scrollIntoViewIfNeeded();
|
||||
}
|
||||
|
||||
// 重新适配尺寸
|
||||
table.resize(id);
|
||||
|
||||
return newNodes;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ layui.define('jquery', function(exports){
|
|||
options = $.extend(true, {
|
||||
target: 'body', // fixbar 的插入目标选择器
|
||||
bars: [], // bar 信息
|
||||
default: true, // 是否显示默认 bar
|
||||
"default": true, // 是否显示默认 bar
|
||||
margin: 160, // 出现 top bar 的滚动条高度临界值
|
||||
duration: 320 // top bar 等动画时长(毫秒)
|
||||
}, options);
|
||||
|
@ -33,7 +33,7 @@ layui.define('jquery', function(exports){
|
|||
: $(options.target === 'body' ? $doc : $target)
|
||||
|
||||
// 是否提供默认图标
|
||||
if(options.default){
|
||||
if(options['default']){
|
||||
// 兼容旧版本的一些属性
|
||||
if(options.bar1){
|
||||
options.bars.push({
|
||||
|
@ -254,35 +254,71 @@ layui.define('jquery', function(exports){
|
|||
},
|
||||
|
||||
// 转化为日期格式字符
|
||||
toDateString: function(time, format){
|
||||
//若 null 或空字符,则返回空字符
|
||||
toDateString: function(time, format, options){
|
||||
// 若 null 或空字符,则返回空字符
|
||||
if(time === null || time === '') return '';
|
||||
|
||||
var that = this
|
||||
,date = new Date(function(){
|
||||
|
||||
// 引用自 dayjs
|
||||
// https://github.com/iamkun/dayjs/blob/v1.11.9/src/constant.js#L30
|
||||
var REGEX_FORMAT = /\[([^\]]+)]|y{1,4}|M{1,2}|d{1,2}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|SSS/g;
|
||||
var that = this;
|
||||
var date = new Date(function(){
|
||||
if(!time) return;
|
||||
return isNaN(time) ? time : (typeof time === 'string' ? parseInt(time) : time)
|
||||
}() || new Date())
|
||||
,ymd = [
|
||||
that.digit(date.getFullYear(), 4)
|
||||
,that.digit(date.getMonth() + 1)
|
||||
,that.digit(date.getDate())
|
||||
]
|
||||
,hms = [
|
||||
that.digit(date.getHours())
|
||||
,that.digit(date.getMinutes())
|
||||
,that.digit(date.getSeconds())
|
||||
];
|
||||
|
||||
|
||||
if(!date.getDate()) return hint.error('Invalid Msec for "util.toDateString(Msec)"'), '';
|
||||
|
||||
var years = date.getFullYear();
|
||||
var month = date.getMonth();
|
||||
var days = date.getDate();
|
||||
var hours = date.getHours();
|
||||
var minutes = date.getMinutes();
|
||||
var seconds = date.getSeconds();
|
||||
var milliseconds = date.getMilliseconds();
|
||||
|
||||
var defaultMeridiem = function(hours, minutes){
|
||||
var hm = hours * 100 + minutes;
|
||||
if (hm < 600) {
|
||||
return '凌晨';
|
||||
} else if (hm < 900) {
|
||||
return '早上';
|
||||
} else if (hm < 1100) {
|
||||
return '上午';
|
||||
} else if (hm < 1300) {
|
||||
return '中午';
|
||||
} else if (hm < 1800) {
|
||||
return '下午';
|
||||
}
|
||||
return '晚上';
|
||||
};
|
||||
|
||||
var meridiem = (options && options.customMeridiem) || defaultMeridiem;
|
||||
|
||||
var matches = {
|
||||
yy: function(){return String(years).slice(-2);},
|
||||
yyyy: function(){return that.digit(years, 4);},
|
||||
M: function(){return String(month + 1);},
|
||||
MM: function(){return that.digit(month + 1);},
|
||||
d: function(){return String(days);},
|
||||
dd: function(){return that.digit(days);},
|
||||
H: function(){return String(hours);},
|
||||
HH: function(){return that.digit(hours);},
|
||||
h: function(){return String(hours % 12 || 12);},
|
||||
hh: function(){return that.digit(hours % 12 || 12);},
|
||||
A: function(){return meridiem(hours, minutes);},
|
||||
m: function(){return String(minutes);},
|
||||
mm: function(){return that.digit(minutes);},
|
||||
s: function(){return String(seconds);},
|
||||
ss: function(){return that.digit(seconds);},
|
||||
SSS: function(){return that.digit(milliseconds, 3);}
|
||||
}
|
||||
|
||||
format = format || 'yyyy-MM-dd HH:mm:ss';
|
||||
return format.replace(/yyyy/g, ymd[0])
|
||||
.replace(/MM/g, ymd[1])
|
||||
.replace(/dd/g, ymd[2])
|
||||
.replace(/HH/g, hms[0])
|
||||
.replace(/mm/g, hms[1])
|
||||
.replace(/ss/g, hms[2]);
|
||||
|
||||
return format.replace(REGEX_FORMAT, function(match, $1) {
|
||||
return $1 || (matches[match] && matches[match]()) || match;
|
||||
});
|
||||
},
|
||||
|
||||
// 转义 html
|
||||
|
@ -322,51 +358,51 @@ layui.define('jquery', function(exports){
|
|||
// 让指定的元素保持在可视区域
|
||||
toVisibleArea: function(options){
|
||||
options = $.extend({
|
||||
margin: 160 //触发动作的边界值
|
||||
,duration: 200 //动画持续毫秒数
|
||||
,type: 'y' //触发方向,x 水平、y 垂直
|
||||
margin: 160, // 触发动作的边界值
|
||||
duration: 200, // 动画持续毫秒数
|
||||
type: 'y' // 触发方向,x 水平、y 垂直
|
||||
}, options);
|
||||
|
||||
if(!options.scrollElem[0] || !options.thisElem[0]) return;
|
||||
|
||||
var scrollElem = options.scrollElem //滚动元素
|
||||
,thisElem = options.thisElem //目标元素
|
||||
,vertical = options.type === 'y' //是否垂直方向
|
||||
,SCROLL_NAME = vertical ? 'scrollTop' : 'scrollLeft' //滚动方法
|
||||
,OFFSET_NAME = vertical ? 'top' : 'left' //坐标方式
|
||||
,scrollValue = scrollElem[SCROLL_NAME]() //当前滚动距离
|
||||
,size = scrollElem[vertical ? 'height' : 'width']() //滚动元素的尺寸
|
||||
,scrollOffet = scrollElem.offset()[OFFSET_NAME] //滚动元素所处位置
|
||||
,thisOffset = thisElem.offset()[OFFSET_NAME] - scrollOffet //目标元素当前的所在位置
|
||||
,obj = {};
|
||||
var scrollElem = options.scrollElem // 滚动元素
|
||||
var thisElem = options.thisElem // 目标元素
|
||||
var vertical = options.type === 'y' // 是否垂直方向
|
||||
var SCROLL_NAME = vertical ? 'scrollTop' : 'scrollLeft' // 滚动方法
|
||||
var OFFSET_NAME = vertical ? 'top' : 'left' // 坐标方式
|
||||
var scrollValue = scrollElem[SCROLL_NAME]() // 当前滚动距离
|
||||
var size = scrollElem[vertical ? 'height' : 'width']() // 滚动元素的尺寸
|
||||
var scrollOffet = scrollElem.offset()[OFFSET_NAME] // 滚动元素所处位置
|
||||
var thisOffset = thisElem.offset()[OFFSET_NAME] - scrollOffet // 目标元素当前的所在位置
|
||||
var obj = {};
|
||||
|
||||
//边界满足条件
|
||||
// 边界满足条件
|
||||
if(thisOffset > size - options.margin || thisOffset < options.margin){
|
||||
obj[SCROLL_NAME] = thisOffset - size/2 + scrollValue
|
||||
scrollElem.animate(obj, options.duration);
|
||||
}
|
||||
},
|
||||
|
||||
//批量事件
|
||||
// 批量事件
|
||||
event: function(attr, obj, eventType){
|
||||
var _body = $('body');
|
||||
eventType = eventType || 'click';
|
||||
|
||||
//记录事件回调集合
|
||||
// 记录事件回调集合
|
||||
obj = util.event[attr] = $.extend(true, util.event[attr], obj) || {};
|
||||
|
||||
//清除委托事件
|
||||
// 清除委托事件
|
||||
util.event.UTIL_EVENT_CALLBACK = util.event.UTIL_EVENT_CALLBACK || {};
|
||||
_body.off(eventType, '*['+ attr +']', util.event.UTIL_EVENT_CALLBACK[attr])
|
||||
|
||||
//绑定委托事件
|
||||
// 绑定委托事件
|
||||
util.event.UTIL_EVENT_CALLBACK[attr] = function(){
|
||||
var othis = $(this)
|
||||
,key = othis.attr(attr);
|
||||
var othis = $(this);
|
||||
var key = othis.attr(attr);
|
||||
(typeof obj[key] === 'function') && obj[key].call(this, othis);
|
||||
};
|
||||
|
||||
//清除旧事件,绑定新事件
|
||||
// 清除旧事件,绑定新事件
|
||||
_body.on(eventType, '*['+ attr +']', util.event.UTIL_EVENT_CALLBACK[attr]);
|
||||
|
||||
return obj;
|
||||
|
@ -375,11 +411,6 @@ layui.define('jquery', function(exports){
|
|||
|
||||
util.on = util.event;
|
||||
|
||||
// DOM 尺寸变化,该创意来自:http://benalman.com/projects/jquery-resize-plugin/
|
||||
/*
|
||||
!function(a,b,c){"$:nomunge";function l(){f=b[g](function(){d.each(function(){var b=a(this),c=b.width(),d=b.height(),e=a.data(this,i);(c!==e.w||d!==e.h)&&b.trigger(h,[e.w=c,e.h=d])}),l()},e[j])}var f,d=a([]),e=a.resize=a.extend(a.resize,{}),g="setTimeout",h="resize",i=h+"-special-event",j="delay",k="throttleWindow";e[j]=250,e[k]=!0,a.event.special[h]={setup:function(){if(!e[k]&&this[g])return!1;var b=a(this);d=d.add(b),a.data(this,i,{w:b.width(),h:b.height()}),1===d.length&&l()},teardown:function(){if(!e[k]&&this[g])return!1;var b=a(this);d=d.not(b),b.removeData(i),d.length||clearTimeout(f)},add:function(b){function f(b,e,f){var g=a(this),h=a.data(this,i)||{};h.w=e!==c?e:g.width(),h.h=f!==c?f:g.height(),d.apply(this,arguments)}if(!e[k]&&this[g])return!1;var d;return a.isFunction(b)?(d=b,f):(d=b.handler,b.handler=f,void 0)}}}($,window);
|
||||
*/
|
||||
|
||||
// 输出接口
|
||||
exports('util', util);
|
||||
});
|
Loading…
Reference in New Issue