Layui弹窗自动聚焦需分场景处理:普通层在success回调中先form.render()再getElementById().focus();iframe层须在子页内用layui.use+DOMContentLoaded聚焦;prompt层用layero.find('.layui-layer-input').focus()。

在Layui弹窗打开时让光标自动落到第一个输入框,是表单类弹窗最基础的交互需求,否则用户每次都要手动点一下才能输入,体验断层明显。
普通页面层(type: 1)中聚焦输入框
第一步:确保弹窗内容是已存在的 DOM 节点,且其中至少有一个 <input> 或 <textarea></textarea> 元素,id 属性不为空(如 id="username")。
第二步:在 layer.open() 的 success 回调里,先调用 form.render('input') 刷新 Layui 表单组件——【不执行这一步,自定义样式的 input 可能尚未被 form 模块接管,后续 focus 会失败】。
第三步:用原生 document.getElementById('xxx').focus() 聚焦目标元素,xxx 替换为实际 id。这一步必须写在 form.render() 之后,顺序不能颠倒。
iframe 层(type: 2)中聚焦子页输入框
父页面 JS 无法直接操作 iframe 内 DOM,尤其在跨域或加载未完成时会报错或静默失效。正确做法是把聚焦逻辑完全下放到子页面内部。
方法一:子页内用 layui.use 加载 form 模块并聚焦
在子页面 HTML 的 <script></script> 标签中写:
layui.use(['form'], function() {
var form = layui.form;
form.render('input');
setTimeout(function() {
document.getElementById('phone').focus();
}, 100);
});
注意:id 必须唯一,若子页用于多次编辑不同数据行,每个弹窗对应子页的 input id 不可复用,否则 getElementById 总取第一个匹配项。
方法二:利用 DOMContentLoaded 替代 setTimeout(更稳妥)
如果子页结构简单、无异步资源阻塞,可改用:
document.addEventListener('DOMContentLoaded', function() {
layui.use(['form'], function() {
var form = layui.form;
form.render('input');
document.getElementById('email').focus();
});
});
layer.prompt 弹窗中聚焦输入框
layer.prompt 本身不提供 autofocus 参数,但可通过 success 回调注入聚焦逻辑。
在调用时传入 success 函数:
layer.prompt({
title: '请输入新密码',
formType: 1,
value: '',
success: function(layero, index) {
setTimeout(function() {
const input = layero.find('.layui-layer-input');
if (input.length) input[0].focus();
}, 10);
}
}, function(value, index) {
layer.close(index);
});
这里用 layero.find('.layui-layer-input') 定位 prompt 内置的 input,比硬编码 id 更安全——因为 prompt 不允许自定义 input id,且 class 名固定。


















