Layui的select是影子DOM,原生option的title无效;需预埋data-title并在change或mouseenter时手动注入到渲染后的DOM中。

直接在 <option> 标签上写 title 属性无效——Layui 渲染后会隐藏原生 <select>,用自定义 DOM 模拟下拉,真实 <option> 不参与交互,浏览器根本不会读取它的 title。
渲染前给 option 加 data-* 属性,change 时读取并手动设 title
Layui 不解析 option 上的 data-*,但你可以主动保留它,并在用户选择后,通过原生 DOM 读取、再动态加到显示层(如 .layui-select-title 或弹出菜单项)上:
- 在 HTML 中提前写好
data-title:<select id="city"> <option value="bj" data-title="北京市,直辖市,政治文化中心">北京</option> <option value="sh" data-title="上海市,直辖市,经济金融中心">上海</option> </select>
- 在
form.on('select(city)', ...)回调里拿到当前选中项的原生option元素:form.on('select(city)', function(data) { const selectElem = data.elem; const selectedIndex = selectElem.selectedIndex; const optionElem = selectElem.options[selectedIndex]; const tip = optionElem.dataset.title || ''; <p>// 把提示文字加到标题栏(可选) layui.$(selectElem).next('.layui-form-select').find('.layui-select-title input').attr('title', tip); }); - 注意:
data-title值不能含双引号或尖括号,否则破坏 HTML 结构;如需动态内容,建议服务端转义后再注入
用 templet 自定义下拉菜单项(仅限 formSelects-v4 等第三方扩展)
原生 Layui 的 select 不支持 templet,但如果你用的是 formSelects-v4 或 xm-select 这类增强组件,就能对下拉列表项做完整控制:
-
xm-select支持renderData钩子,可改写每项的 HTML:xmSelect.render({ el: '#city', renderData: function(data) { return data.map(item => ({ ...item, html: `<dd lay-value="${item.value}" title="${item.title || ''}">${item.name}</dd>` })) } }) - 关键点:
title要写在生成的<dd>上,不是<option>;renderData返回的html字段决定最终 DOM - 原生 Layui 没这个能力,强行 hack 容易和后续版本冲突,不推荐
替代方案:hover 时浮层显示详情(更可靠)
如果目标是「悬停看说明」,比硬塞 title 更稳的方式是监听下拉展开事件,用 layer.tips() 动态展示:
- 监听
.layui-form-select的mouseenter,结合data-title预埋值:layui.$('.layui-form-select').on('mouseenter', '.layui-select-title', function() { const $select = layui.$(this).closest('.layui-form-select').find('select'); const selectedIndex = $select[0].selectedIndex; if (selectedIndex >= 0) { const tip = $select[0].options[selectedIndex].dataset.title; if (tip) layer.tips(tip, this, { tips: [1, '#787878'] }); } }); - 注意:要配合
mouseleave主动关闭 tips,避免残留;layer.tips可控性远高于原生title - 这个方案不依赖渲染时机,也不怕属性被忽略,适合字段说明较长、需要格式化展示的场景
真正卡住人的地方,从来不是“怎么加”,而是没意识到 Layui 的 select 是个「影子 DOM」——你看到的下拉菜单,和原始 option 已经不是同一个东西。所有属性操作,必须分清「源头预埋」和「目标注入」两个阶段,漏掉任一环都会失效。


















