layui layer弹窗中,右上角×与esc统一走cancel回调,「确定」走第三个参数回调,「取消」按钮走第四个参数回调;cancel中无法直接区分×与遮罩关闭,仅当shadeclose:false且未主动调用layer.close时可默认视为×触发。

在使用 layui layer 弹窗时,需要区分用户点击的是「确定」按钮还是右上角关闭 ×,以便执行不同逻辑(比如保存数据 or 清理临时状态),不能靠事件冒泡监听 DOM 元素,必须依赖 layer 自身的回调机制和参数特征。
通过 cancel 与 yes 回调自然分离行为
layer.confirm 默认提供三个可绑定的回调函数:第三个参数是「确定」按钮回调,第四个参数是「取消」按钮回调,而右上角 × 触发的是独立的 cancel 配置项——三者互不干扰,天然可区分。
这一步操作起来很简单,直接把业务逻辑写进对应回调里就行。
右上角 × 和按 ESC 键统一走 cancel;点击弹窗内的「取消」按钮走第四个参数回调;点击「确定」按钮走第三个参数回调。三者触发路径完全隔离,不会混淆。
在 cancel 回调中识别关闭来源(仅限 layer.open)
对于 layer.open 类型弹窗,cancel 回调接收两个参数:index(当前层索引)和 layero(DOM 节点对象)。但 layui 不提供 source 属性来标识点击位置,所以不能靠参数直接判断是点了 × 还是点了遮罩。
不过,若配置了 shadeClose: true,点击遮罩也会触发 cancel —— 此时你无法区分来源,这是 layui 的设计限制。
真正能确定是右上角 × 的唯一可靠信号是:closeBtn 值为 1(默认)且未禁用按钮,同时 cancel 被触发,且你没在其他地方主动调 layer.close(index)。
用 DOM 事件辅助判断(慎用,仅作补充)
方法一:给右上角关闭按钮加自定义 data 属性
在 layer.open 后立即执行:$(layero).find('.layui-layer-close').attr('data-trigger', 'x-btn');
然后在 cancel 回调开头读取:const trigger = $(layero).find('.layui-layer-close').data('trigger'); if (trigger === 'x-btn') { /* 确实点了 × */ }。
注意:此方式依赖 layer DOM 结构稳定,【layer 版本升级可能破坏 .layui-layer-close 选择器】,生产环境不推荐作为主判断逻辑。
方法二:监听 layero 上的 click 事件并委托到关闭按钮
在 open 成功后(即 success 回调中)绑定:$(layero).on('click', '.layui-layer-close', function() { console.log('明确捕获 × 点击'); });
这个监听只响应真实点击,不触发 cancel,可作为日志或副作用补充,但不能替代 cancel 做主流程控制。











