mirror of https://github.com/layui/layui
feat(layer): 新增 beforeEnd 回调 (#1968)
* feat(layer): 新增 beforeEnd 回调 * docs(layer): 更新 beforeEnd 文档 * update * update * refactor: 简化代码 * docs(layer): 更新 beforeEnd 文档 * update * updatepull/1986/head
parent
c32e65b944
commit
d81ada23b1
|
@ -733,6 +733,41 @@ layer.open({
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
|
|
||||||
|
[beforeEnd](#options.beforeEnd) <sup>2.9.11+</sup>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td colspan="3">
|
||||||
|
|
||||||
|
<div id="options.beforeEnd" lay-pid="options" class="ws-anchor">
|
||||||
|
弹层被关闭前的回调函数。如果返回 false 或者 Promise.reject,将会取消关闭操作。
|
||||||
|
</div>
|
||||||
|
|
||||||
|
```
|
||||||
|
layer.open({
|
||||||
|
content: '<div style="padding: 32px;"><input id="id"/></div>',
|
||||||
|
/** @type {(layero: JQuery, index: number) => boolean | JQueryDeferred<boolean> | Promise<boolean>} */
|
||||||
|
beforeEnd: function(layero, index){
|
||||||
|
return $.Deferred(function(defer){
|
||||||
|
var el = layero.find('#id');
|
||||||
|
var val = el.val().trim();
|
||||||
|
if(val){
|
||||||
|
layer.confirm('关闭后您填写的内容将不会得到保存,确定关闭吗?', function (i) {
|
||||||
|
layer.close(i);
|
||||||
|
defer.resolve(true)
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
defer.resolve(true)
|
||||||
|
}
|
||||||
|
}).promise();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
|
||||||
[end](#options.end)
|
[end](#options.end)
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -30,6 +30,7 @@ var ready = {
|
||||||
removeFocus: true
|
removeFocus: true
|
||||||
},
|
},
|
||||||
end: {},
|
end: {},
|
||||||
|
beforeEnd: {},
|
||||||
events: {resize: {}},
|
events: {resize: {}},
|
||||||
minStackIndex: 0,
|
minStackIndex: 0,
|
||||||
minStackArr: [],
|
minStackArr: [],
|
||||||
|
@ -925,6 +926,7 @@ Class.pt.callback = function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
config.end && (ready.end[that.index] = config.end);
|
config.end && (ready.end[that.index] = config.end);
|
||||||
|
config.beforeEnd && (ready.beforeEnd[that.index] = config.beforeEnd);
|
||||||
};
|
};
|
||||||
|
|
||||||
// for ie6 恢复 select
|
// for ie6 恢复 select
|
||||||
|
@ -1219,87 +1221,116 @@ layer.close = function(index, callback){
|
||||||
|
|
||||||
if(!layero[0]) return;
|
if(!layero[0]) return;
|
||||||
|
|
||||||
// 关闭动画
|
var executor = function(){
|
||||||
var closeAnim = ({
|
// 关闭动画
|
||||||
slideDown: 'layer-anim-slide-down-out',
|
var closeAnim = ({
|
||||||
slideLeft: 'layer-anim-slide-left-out',
|
slideDown: 'layer-anim-slide-down-out',
|
||||||
slideUp: 'layer-anim-slide-up-out',
|
slideLeft: 'layer-anim-slide-left-out',
|
||||||
slideRight: 'layer-anim-slide-right-out'
|
slideUp: 'layer-anim-slide-up-out',
|
||||||
})[options.anim] || 'layer-anim-close';
|
slideRight: 'layer-anim-slide-right-out'
|
||||||
|
})[options.anim] || 'layer-anim-close';
|
||||||
// 移除主容器
|
|
||||||
var remove = function(){
|
// 移除主容器
|
||||||
var WRAP = 'layui-layer-wrap';
|
var remove = function(){
|
||||||
|
var WRAP = 'layui-layer-wrap';
|
||||||
// 是否关闭时隐藏弹层容器
|
|
||||||
if(hideOnClose){
|
// 是否关闭时隐藏弹层容器
|
||||||
layero.removeClass('layer-anim '+ closeAnim);
|
if(hideOnClose){
|
||||||
return layero.hide();
|
layero.removeClass('layer-anim '+ closeAnim);
|
||||||
}
|
return layero.hide();
|
||||||
|
|
||||||
// 是否为页面捕获层
|
|
||||||
if(type === ready.type[1] && layero.attr('conType') === 'object'){
|
|
||||||
layero.children(':not(.'+ doms[5] +')').remove();
|
|
||||||
var wrap = layero.find('.'+WRAP);
|
|
||||||
for(var i = 0; i < 2; i++){
|
|
||||||
wrap.unwrap();
|
|
||||||
}
|
}
|
||||||
wrap.css('display', wrap.data('display')).removeClass(WRAP);
|
|
||||||
} else {
|
// 是否为页面捕获层
|
||||||
// 低版本 IE 回收 iframe
|
if(type === ready.type[1] && layero.attr('conType') === 'object'){
|
||||||
if(type === ready.type[2]){
|
layero.children(':not(.'+ doms[5] +')').remove();
|
||||||
try {
|
var wrap = layero.find('.'+WRAP);
|
||||||
var iframe = $('#'+ doms[4] + index)[0];
|
for(var i = 0; i < 2; i++){
|
||||||
iframe.contentWindow.document.write('');
|
wrap.unwrap();
|
||||||
iframe.contentWindow.close();
|
}
|
||||||
layero.find('.'+doms[5])[0].removeChild(iframe);
|
wrap.css('display', wrap.data('display')).removeClass(WRAP);
|
||||||
} catch(e){}
|
} else {
|
||||||
|
// 低版本 IE 回收 iframe
|
||||||
|
if(type === ready.type[2]){
|
||||||
|
try {
|
||||||
|
var iframe = $('#'+ doms[4] + index)[0];
|
||||||
|
iframe.contentWindow.document.write('');
|
||||||
|
iframe.contentWindow.close();
|
||||||
|
layero.find('.'+doms[5])[0].removeChild(iframe);
|
||||||
|
} catch(e){}
|
||||||
|
}
|
||||||
|
layero[0].innerHTML = '';
|
||||||
|
layero.remove();
|
||||||
}
|
}
|
||||||
layero[0].innerHTML = '';
|
|
||||||
layero.remove();
|
typeof ready.end[index] === 'function' && ready.end[index]();
|
||||||
}
|
delete ready.end[index];
|
||||||
|
typeof callback === 'function' && callback();
|
||||||
typeof ready.end[index] === 'function' && ready.end[index]();
|
|
||||||
delete ready.end[index];
|
// 移除 reisze 事件
|
||||||
typeof callback === 'function' && callback();
|
if(ready.events.resize[index]){
|
||||||
|
win.off('resize', ready.events.resize[index]);
|
||||||
// 移除 reisze 事件
|
delete ready.events.resize[index];
|
||||||
if(ready.events.resize[index]){
|
}
|
||||||
win.off('resize', ready.events.resize[index]);
|
};
|
||||||
delete ready.events.resize[index];
|
// 移除遮罩
|
||||||
}
|
var shadeo = $('#'+ doms.SHADE + index);
|
||||||
};
|
if((layer.ie && layer.ie < 10) || !options.isOutAnim){
|
||||||
// 移除遮罩
|
|
||||||
var shadeo = $('#'+ doms.SHADE + index);
|
|
||||||
if((layer.ie && layer.ie < 10) || !options.isOutAnim){
|
|
||||||
shadeo[hideOnClose ? 'hide' : 'remove']();
|
|
||||||
}else{
|
|
||||||
shadeo.css({opacity: 0});
|
|
||||||
setTimeout(function(){
|
|
||||||
shadeo[hideOnClose ? 'hide' : 'remove']();
|
shadeo[hideOnClose ? 'hide' : 'remove']();
|
||||||
}, 350);
|
}else{
|
||||||
|
shadeo.css({opacity: 0});
|
||||||
|
setTimeout(function(){
|
||||||
|
shadeo[hideOnClose ? 'hide' : 'remove']();
|
||||||
|
}, 350);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 是否允许关闭动画
|
||||||
|
if(options.isOutAnim){
|
||||||
|
layero.addClass('layer-anim '+ closeAnim);
|
||||||
|
}
|
||||||
|
|
||||||
|
layer.ie == 6 && ready.reselect();
|
||||||
|
ready.restScrollbar(index);
|
||||||
|
|
||||||
|
// 记住被关闭层的最小化堆叠坐标
|
||||||
|
if(typeof layero.attr('minLeft') === 'string'){
|
||||||
|
ready.minStackIndex--;
|
||||||
|
ready.minStackArr.push(layero.attr('minLeft'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if((layer.ie && layer.ie < 10) || !options.isOutAnim){
|
||||||
|
remove()
|
||||||
|
} else {
|
||||||
|
setTimeout(function(){
|
||||||
|
remove();
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否允许关闭动画
|
if(!hideOnClose && typeof ready.beforeEnd[index] === 'function'){
|
||||||
if(options.isOutAnim){
|
// 类似 Promise.resolve
|
||||||
layero.addClass('layer-anim '+ closeAnim);
|
var promiseLikeResolve = function(value){
|
||||||
}
|
var deferred = $.Deferred();
|
||||||
|
|
||||||
layer.ie == 6 && ready.reselect();
|
if(value && typeof value.then === 'function'){
|
||||||
ready.restScrollbar(index);
|
value.then(deferred.resolve, deferred.reject);
|
||||||
|
}else{
|
||||||
// 记住被关闭层的最小化堆叠坐标
|
deferred.resolve(value);
|
||||||
if(typeof layero.attr('minLeft') === 'string'){
|
}
|
||||||
ready.minStackIndex--;
|
return deferred.promise();
|
||||||
ready.minStackArr.push(layero.attr('minLeft'));
|
}
|
||||||
}
|
|
||||||
|
promiseLikeResolve(ready.beforeEnd[index](layero, index))
|
||||||
if((layer.ie && layer.ie < 10) || !options.isOutAnim){
|
.then(function(result){
|
||||||
remove()
|
if(result !== false){
|
||||||
} else {
|
delete ready.beforeEnd[index];
|
||||||
setTimeout(function(){
|
executor();
|
||||||
remove();
|
}
|
||||||
}, 200);
|
}, function(reason){
|
||||||
|
reason !== undefined && window.console && window.console.error('layer error hint: ' + reason);
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
delete ready.beforeEnd[index];
|
||||||
|
executor();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue