layer.open 的 cancel 回调需在配置中直接设置,点击右上角×或按ESC时触发,默认不带参数,返回 false 可阻止关闭;它不接管关闭逻辑,也不响应遮罩点击(走 end)或 iframe 内部关闭。
layer.open 的 cancel 回调怎么写
直接在 layer.open 配置里加 cancel 字段,它会在用户点击右上角 × 或按 esc 时触发。这个回调函数默认不带参数,但你可以通过闭包或外部变量捕获当前上下文。
-
cancel是纯回调,不接管关闭逻辑——执行完后 layer 仍会自动关闭;如需阻止关闭,得在回调里返回false - 如果同时用了
yes和cancel,注意它们的触发时机不同:yes对应确认按钮,cancel对应取消类操作(×、ESC、遮罩点击默认不触发 cancel,除非显式配置closeBtn: 1且用户点 ×) - 遮罩点击(
shadeClose: true)不会触发cancel,它走的是独立的end回调,别混淆
为什么点了“取消”没进 cancel 回调
常见原因是弹层类型或配置不匹配。比如用 type: 2(iframe 层)时,右上角 × 默认关闭 iframe 页面本身,而不是 layer 实例;或者 closeBtn: 0 关掉了关闭按钮,导致根本没 × 可点。
- 确保
closeBtn: 1(默认值),否则右上角无 ×,cancel 失效 - 避免在
content里手动绑定点击事件去调layer.close(index),这会绕过 cancel 回调 - 如果是
type: 2,iframe 内部需用parent.layer.close(parent.layer.getFrameIndex(window.name))主动通知父页关闭,否则 cancel 不触发
cancel 里想获取 layer 索引或传参怎么办
cancel 回调函数内部拿不到 index 参数,但你可以在 layer.open 外提前存好索引,或用闭包捕获上下文变量。
const myData = { id: 123, form: '#editForm' };
const index = layer.open({
content: '<div>编辑用户</div>',
cancel() {
console.log('用户取消,原始数据:', myData); // 闭包访问
$(myData.form)[0].reset(); // 操作关联 DOM
return true; // 允许关闭
}
});
- 不要在 cancel 里直接调
layer.close(index),这是冗余的,cancel 执行完 layer 自动关 - 若需异步判断(比如确认是否真的要放弃修改),cancel 中 return
false阻止关闭,再手动调layer.close(index)或做其他处理 - 慎用
layer.closeAll()在 cancel 里,可能误关其它层
和 end / yes 回调的区别与配合
end 是 layer 彻底销毁后的回调(无论怎么关都会触发),yes 是确认按钮回调(仅 type: 1/2/3 有默认按钮时有效),而 cancel 专用于取消动作——三者定位不同,别混用。
- 需要“统一收尾逻辑”(如清空临时状态、释放资源)放
end - 需要“区分用户意图”(确认提交 vs 主动放弃)就靠
yes和cancel -
cancel和yes都支持返回false阻止默认行为;end不支持返回值


















