layui tree 组件原生不支持 dblclick 事件,需委托绑定 .layui-tree-txt 元素的双击事件并排除开关图标,同时处理 user-select 样式、焦点管理及 updatenode 的 id 类型一致性。
layui tree 组件原生不提供 dblclick 事件监听,必须手动绑定 dom 级双击事件,且需绕过内部 click 冲突和样式限制。
为什么 tree.on('dblclick') 根本不生效
因为 Layui tree 模块(截至 2.8.18)未注册任何名为 dblclick 的内置事件;官方只暴露了 click 和 check 两类事件。所有试图用 tree.on('dblclick(...)', ...) 的写法都会静默失败。
常见错误现象:控制台无报错、回调从不执行、双击后只有单击效果(如展开/折叠)。
- 不要查文档里不存在的 API,Layui 官网 tree 文档中从未定义过
dblclick事件名 - 不要在
tree.render()的 options 里加dblclick: function(){}—— 这个字段会被完全忽略 - 避免用原生
elem.addEventListener('dblclick', ...)直接绑在容器上,容易捕获到开关图标、复选框等非文本区域
正确做法:委托监听 .layui-tree-txt 的 dblclick
树节点的文本内容始终包裹在 <span class="layui-tree-txt"></span> 中,这是唯一稳定可绑定的 target。必须用事件委托方式绑定,否则动态加载的子节点无法响应。
实操代码示例:
layui.tree.render({
elem: '#treeDemo',
data: treeData,
id: 'demoTree'
});
// 渲染完成后绑定(不能放在 render 前)
layui.$('#treeDemo').on('dblclick', '.layui-tree-txt:not(.layui-tree-switch)', function(e) {
e.stopPropagation();
e.preventDefault();
// 获取当前节点数据
const nodeData = layui.tree.getNodeData(this);
if (!nodeData || nodeData.disabled) return;
console.log('双击节点:', nodeData);
});
-
.layui-tree-txt:not(.layui-tree-switch)排除掉左侧展开图标区域,防止误触 - 务必加
e.stopPropagation(),否则会触发 tree 内部的click逻辑(比如意外折叠) - 检查
nodeData.disabled,禁用节点不应响应双击 - 不要用
$(document).on(...)全局委托 —— 容易被其他组件干扰
双击后输入框聚焦失败?检查 CSS user-select
双击后替换成 <input> 却无法选中文字、光标不显示,大概率是 Layui 默认样式阻止了文本选择:
.layui-tree-txt { user-select: none; } 会继承给子 input,导致输入框失焦或无法拖选。
- 必须覆盖该样式:
.layui-tree-txt input { user-select: text !important; } - 同时建议加
width: 100%;和box-sizing: border-box;避免宽度溢出 - 若用
contenteditable替代input,同样要加此样式,且需手动处理 Enter 失焦逻辑
监听时机与清理:避免多个 input 叠加或焦点丢失
连续双击同一节点、或快速切换节点时,旧的 input 若未移除,会导致 DOM 堆叠、事件混乱、失焦后值未保存等问题。
- 每次双击前先清理:
$(this).find('input').remove(); - 聚焦后立即
.select()全选文字,提升编辑体验 - 监听
keydown.enter和blur两个时机提交,缺一不可(用户可能不按 Enter,直接点别处) - 提交前校验空值、重复名,再调用
tree.updateNode(nodeData.id, { title: newValue })
最易被忽略的是:tree.updateNode 要求 id 类型与原始数据中一致(字符串就全用字符串,数字就全用数字),混用会导致更新失败且无提示。











