mirror of https://github.com/layui/layui
commit
7d5d8ce8bc
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
|
@ -5,8 +5,8 @@ toc: true
|
|||
|
||||
# 树表组件 <sup title="指在该版本新增的组件">2.8+</sup>
|
||||
|
||||
> 树表组件 `treeTable` 是基于 `table` 组件延伸的树形表格组件,支持常见的树组件功能。
|
||||
> 注意:*该组件不支持 IE8*
|
||||
> 树表组件 `treeTable` 是基于 `table` 组件延伸的树形表格组件,支持常见的树组件功能。<br>
|
||||
> 注意:*该组件不支持 IE8,若要支持,可自行添加 <a href="https://github.com/inexorabletash/polyfill/blob/716a3f36ca10fad032083014faf1a47c638e2502/es5.js#L300-L345" rel="nofollow" target="_blank">polyfill</a>实现兼容。*
|
||||
|
||||
<h2 id="examples" lay-toc="{anchor: null}" style="margin-bottom: 0;">示例</h2>
|
||||
|
||||
|
|
|
@ -13,8 +13,8 @@ toc: true
|
|||
|
||||
|
||||
<h2 id="2.8.18" class="ws-anchor">
|
||||
2.8.18-rc.2
|
||||
<span class="layui-badge-rim">2023-10-25</span>
|
||||
2.8.18-rc.3
|
||||
<span class="layui-badge-rim">2023-10-31</span>
|
||||
</h2>
|
||||
|
||||
- #### form
|
||||
|
@ -23,15 +23,17 @@ toc: true
|
|||
- 优化 `input` 数字输入框组件当值达到临界点时加减按钮的禁用视觉效果 # 1375
|
||||
- 优化 `input` 数字输入框当表单验证失败时的边框颜色 # 1371
|
||||
- #### nav
|
||||
- 新增 垂直导航菜单展开和收缩时的过渡动画 # 1384
|
||||
- 新增 垂直导航菜单展开和收缩时的过渡动画 # 1407
|
||||
- 新增 `lay-accordion` 属性支持,用于开启手风琴,兼容旧版 `lay-shrink="all"` # 1384
|
||||
- #### layer
|
||||
- 新增 `photos` 层的鼠标滚轮缩放功能 # I7ZAE8
|
||||
- 优化 移动端定位 # 1376
|
||||
- #### table
|
||||
- 新增 `complete` 属性,当数据接口请求完成后执行,无论成功还是失败均会触发 # 1379
|
||||
- 修复 `ignoreExport` 表头属性值效果与文档不符的问题 # I86DBY
|
||||
- 修复 `type:'radio'` 且为右侧固定列时,选择效果无效的问题 # 1406
|
||||
- #### treeTable
|
||||
- 修复 `treeTable.removeNode()` 在开启 `data` 模式时删除异常问题 # I7Z0A/I82E2S
|
||||
- 修复 `treeTable.removeNode()` 在开启 `data` 模式时删除异常问题 # I7Z0AB/I82E2S
|
||||
- 修复 `treeTable.setRowChecked()` 方法未逐层展开上级节点的问题 # 1385/I84RUT
|
||||
- #### upload
|
||||
- 修复 `unified: true` 时的报错问题 # 1391
|
||||
|
@ -41,7 +43,8 @@ toc: true
|
|||
- 新增 `accordion` 属性,开启手风琴效果(menu: 主容器设置 `lay-accordion` 属性) # 1397
|
||||
- 新增 折叠展开动画效果 # 1397
|
||||
- #### laydate
|
||||
- 优化 开启 `rangeLinked` 属性后,点击目标元素可重新渲染的问题 # 1391
|
||||
- 优化 `rangeLinked` 属性开启时,点击目标元素可重新渲染的问题 # 1391
|
||||
- 优化 `type` 为 `time,datetime` 选择器时,「现在」按钮的禁用状态判断条件 # I828CD
|
||||
- #### laypage
|
||||
- 新增 `limitTemplet` 属性,用于自定义条目模板 # I80AHZ
|
||||
- 新增 `skipText` 属性,用于自定义跳页区域文本 # I80AHZ
|
||||
|
@ -58,7 +61,7 @@ toc: true
|
|||
- 新增 lay 模块部分函数 JSDoc 注释和示例 #1401
|
||||
- 优化 `<hr>` 全局样式优先级 # I86R6G
|
||||
|
||||
### 下载: [layui-v2.8.18.rc.2.zip](https://gitee.com/layui/layui/attach_files/1563717/download)
|
||||
### 下载: [layui-v2.8.18.rc.3.zip](https://gitee.com/layui/layui/attach_files/1569050/download)
|
||||
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "layui",
|
||||
"version": "2.8.18-rc.2",
|
||||
"version": "2.8.18-rc.3",
|
||||
"description": "Classic modular Front-End UI library",
|
||||
"main": "dist/layui.js",
|
||||
"license": "MIT",
|
||||
|
|
|
@ -834,6 +834,7 @@ hr.layui-border-black{border-width: 0 0 1px;}
|
|||
.layui-input-wrap .layui-input[type="number"]::-webkit-outer-spin-button,
|
||||
.layui-input-wrap .layui-input[type="number"]::-webkit-inner-spin-button{-webkit-appearance: none !important;}
|
||||
.layui-input-wrap .layui-input[type="number"]{-moz-appearance: textfield;}
|
||||
.layui-input-wrap .layui-input[type="number"].layui-input-number-out-of-range{color:#ff5722;}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
};
|
||||
|
||||
var Layui = function(){
|
||||
this.v = '2.8.18-rc.2'; // Layui 版本号
|
||||
this.v = '2.8.18-rc.3'; // Layui 版本号
|
||||
};
|
||||
|
||||
// 识别预先可能定义的指定全局对象
|
||||
|
|
|
@ -444,31 +444,33 @@ layui.define(['jquery', 'laytpl', 'lay', 'util'], function(exports){
|
|||
|
||||
// 设置菜单组展开和收缩状态
|
||||
thisModule.spread = function(othis, isAccordion){
|
||||
var contentElem = othis.children('ul');
|
||||
var needSpread = othis.hasClass(STR_ITEM_UP);
|
||||
var ANIM_MS = 200;
|
||||
|
||||
var toggle = function (groupElem, isOpen) {
|
||||
var contentElem = groupElem.children('ul');
|
||||
var contentHeight = contentElem[0].scrollHeight;
|
||||
// 动画执行完成后的操作
|
||||
var complete = function() {
|
||||
$(this).css({'display': ''}); // 剔除临时 style,以适配外部样式的状态重置;
|
||||
};
|
||||
|
||||
if(contentElem.is(':animated')) return;
|
||||
// 动画是否正在执行
|
||||
if (contentElem.is(':animated')) return;
|
||||
|
||||
groupElem.removeClass(isOpen ? STR_ITEM_UP : STR_ITEM_DOWN).addClass(isOpen ? STR_ITEM_DOWN : STR_ITEM_UP);
|
||||
contentElem.height(isOpen ? 0 : contentHeight)
|
||||
.stop()
|
||||
.animate({
|
||||
opacity: isOpen ? 1 : 0,
|
||||
height: isOpen ? contentHeight : 0
|
||||
}, 200, function(){
|
||||
contentElem.css({ height: '', opacity: '' })
|
||||
})
|
||||
// 展开
|
||||
if (needSpread) {
|
||||
othis.removeClass(STR_ITEM_UP).addClass(STR_ITEM_DOWN);
|
||||
contentElem.hide().stop().slideDown(ANIM_MS, complete);
|
||||
} else { // 收缩
|
||||
contentElem.stop().slideUp(ANIM_MS, complete);
|
||||
othis.removeClass(STR_ITEM_DOWN).addClass(STR_ITEM_UP);
|
||||
}
|
||||
|
||||
toggle(othis, needSpread);
|
||||
|
||||
if (!needSpread || !isAccordion) return;
|
||||
layui.each(othis.siblings('.' + STR_ITEM_DOWN), function(index, item){
|
||||
toggle($(item), false);
|
||||
})
|
||||
// 手风琴
|
||||
if (needSpread && isAccordion) {
|
||||
var groupSibs = othis.siblings('.' + STR_ITEM_DOWN);
|
||||
groupSibs.children('ul').stop().slideUp(ANIM_MS, complete);
|
||||
groupSibs.removeClass(STR_ITEM_DOWN).addClass(STR_ITEM_UP);
|
||||
}
|
||||
};
|
||||
|
||||
// 全局事件
|
||||
|
|
|
@ -17,6 +17,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
|
|||
var SHOW = 'layui-show';
|
||||
var HIDE = 'layui-hide';
|
||||
var DISABLED = 'layui-disabled';
|
||||
var OUT_OF_RANGE = 'layui-input-number-out-of-range';
|
||||
|
||||
var Form = function(){
|
||||
this.config = {
|
||||
|
@ -174,7 +175,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
|
|||
// 初始化全局的 autocomplete
|
||||
options.autocomplete && inputs.attr('autocomplete', options.autocomplete);
|
||||
|
||||
var handleInputNumberEvents = function(elem, eventType){
|
||||
var handleInputNumber = function(elem, eventType){
|
||||
var that = this;
|
||||
var rawValue = elem.val();
|
||||
var value = Number(rawValue);
|
||||
|
@ -182,7 +183,8 @@ layui.define(['lay', 'layer', 'util'], function(exports){
|
|||
var min = Number(elem.attr('min'));
|
||||
var max = Number(elem.attr('max'));
|
||||
var precision = Number(elem.attr('lay-precision'));
|
||||
var noAction = eventType === 'blur' && rawValue === '' // 失焦时空值不作处理
|
||||
var noAction = eventType !== 'click' && rawValue === ''; // 初始渲染和失焦时空值不作处理
|
||||
var isInit = eventType === 'init';
|
||||
|
||||
if(isNaN(value)) return; // 若非数字,则不作处理
|
||||
|
||||
|
@ -200,13 +202,21 @@ layui.define(['lay', 'layer', 'util'], function(exports){
|
|||
precision = precision >= 0 ? precision : Math.max(decimals(step), decimals(rawValue));
|
||||
|
||||
if(!noAction){
|
||||
if(value <= min) value = min;
|
||||
if(value >= max) value = max;
|
||||
// 初始渲染时只处理数字精度
|
||||
if(!isInit){
|
||||
if(value <= min) value = min;
|
||||
if(value >= max) value = max;
|
||||
}
|
||||
if(precision) value = value.toFixed(precision);
|
||||
|
||||
elem.val(value)
|
||||
elem.val(value);
|
||||
}
|
||||
|
||||
// 超出范围的样式
|
||||
var outOfRange = value < min || value > max;
|
||||
elem[outOfRange && !noAction ? 'addClass' : 'removeClass'](OUT_OF_RANGE);
|
||||
|
||||
if(isInit) return;
|
||||
|
||||
// 更新按钮状态
|
||||
var controlBtn = {
|
||||
increment: elem.next().find('.layui-icon-up'),
|
||||
|
@ -285,6 +295,8 @@ layui.define(['lay', 'layer', 'util'], function(exports){
|
|||
|
||||
opts.show === 'auto' && showAffix(elemAffix, othis.val());
|
||||
|
||||
typeof opts.init === 'function' && opts.init.call(this, othis, opts);
|
||||
|
||||
// 输入事件
|
||||
othis.on('input propertychange', function(){
|
||||
var value = this.value;
|
||||
|
@ -341,11 +353,14 @@ layui.define(['lay', 'layer', 'util'], function(exports){
|
|||
split: true,
|
||||
className: 'layui-input-number',
|
||||
disabled: othis.is('[disabled]'), // 跟随输入框禁用状态
|
||||
init: function(elem){
|
||||
handleInputNumber.call(this, elem, 'init')
|
||||
},
|
||||
click: function(elem){
|
||||
handleInputNumberEvents.call(this, elem, 'click')
|
||||
handleInputNumber.call(this, elem, 'click')
|
||||
},
|
||||
blur: function(elem){
|
||||
handleInputNumberEvents.call(this, elem, 'blur')
|
||||
handleInputNumber.call(this, elem, 'blur')
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1245,7 +1245,7 @@
|
|||
// 现在按钮
|
||||
that.limit({
|
||||
elem: lay(that.footer).find(ELEM_NOW),
|
||||
date: that.systemDate(),
|
||||
date: that.systemDate(/^(datetime|time)$/.test(options.type) ? new Date() : null),
|
||||
index: 0,
|
||||
time: timeParams
|
||||
});
|
||||
|
|
|
@ -1531,11 +1531,13 @@ layer.photos = function(options, loop, key){
|
|||
|
||||
// 一些动作
|
||||
dict.event = function(layero, index, that){
|
||||
// 上一张
|
||||
dict.main.find('.layui-layer-photos-prev').on('click', function(event){
|
||||
event.preventDefault();
|
||||
dict.imgprev(true);
|
||||
});
|
||||
|
||||
// 下一张
|
||||
dict.main.find('.layui-layer-photos-next').on('click', function(event){
|
||||
event.preventDefault();
|
||||
dict.imgnext(true);
|
||||
|
@ -1545,7 +1547,8 @@ layer.photos = function(options, loop, key){
|
|||
|
||||
// 头部工具栏事件
|
||||
layero.off('click').on('click','*[toolbar-event]', function () {
|
||||
var othis = $(this), event = othis.attr('toolbar-event');
|
||||
var othis = $(this);
|
||||
var event = othis.attr('toolbar-event');
|
||||
switch (event) {
|
||||
case 'rotate':
|
||||
dict.image.rotate = ((dict.image.rotate || 0) + Number(othis.attr('data-option'))) % 360;
|
||||
|
@ -1586,6 +1589,17 @@ layer.photos = function(options, loop, key){
|
|||
that.auto(index);
|
||||
});
|
||||
|
||||
// 鼠标滚轮缩放图片事件
|
||||
dict.main.children('img').on('mousewheel DOMMouseScroll', function(e) {
|
||||
var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;
|
||||
var zoomElem = dict.main.find('[toolbar-event="zoom"]');
|
||||
if (delta > 0) {
|
||||
zoomElem.eq(0).trigger('click');
|
||||
} else {
|
||||
zoomElem.eq(1).trigger('click');
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// 图片预加载
|
||||
|
|
|
@ -896,6 +896,9 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
|
|||
// 重置表格尺寸/结构
|
||||
Class.prototype.resize = function(){
|
||||
var that = this;
|
||||
|
||||
if (!that.layMain) return;
|
||||
|
||||
that.fullSize(); // 让表格铺满
|
||||
that.setColsWidth(); // 自适应列宽
|
||||
that.scrollPatch(); // 滚动条补丁
|
||||
|
@ -1593,8 +1596,12 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
|
|||
radio: 'layTableRadio',
|
||||
checkbox: 'layTableCheckbox'
|
||||
}[opts.type] || 'checkbox') +'"]:not(:disabled)');
|
||||
var checkedSameElem = checkedElem.last();
|
||||
var fixRElem = checkedSameElem.closest(ELEM_FIXR);
|
||||
|
||||
checkedElem.prop('checked', getChecked(checkedElem.last().prop('checked')));
|
||||
( opts.type === 'radio' && fixRElem.hasClass(HIDE)
|
||||
? checkedElem.first()
|
||||
: checkedElem ).prop('checked', getChecked(checkedSameElem.prop('checked')));
|
||||
|
||||
that.syncCheckAll();
|
||||
that.renderForm(opts.type);
|
||||
|
|
Loading…
Reference in New Issue