news 2026/4/15 18:57:50

jQuery EasyUI 树形菜单 - 树形菜单拖放控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jQuery EasyUI 树形菜单 - 树形菜单拖放控制

下面直接给你最实用、最常见的树形菜单拖放控制(Draggable & Droppable Tree)方法,jQuery EasyUI 的tree组件内置支持拖拽节点(移动节点、排序、跨树拖拽),复制粘贴就能用,领导最爱的“菜单排序、部门调动、分类拖拽调整层级”效果全都有!

方法1:最简单最常用 - 开启基本拖放(推荐现在就用这个,3秒出效果)

<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>EasyUI 树形菜单 - 拖放控制</title><linkrel="stylesheet"type="text/css"href="https://www.jeasyui.com/easyui/themes/default/easyui.css"><linkrel="stylesheet"type="text/css"href="https://www.jeasyui.com/easyui/themes/icon.css"><scripttype="text/javascript"src="https://code.jquery.com/jquery-1.12.4.min.js"></script><scripttype="text/javascript"src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script></head><body><divstyle="margin:30px;"><divstyle="margin-bottom:15px;"><ahref="javascript:void(0)"class="easyui-linkbutton c6"iconCls="icon-save"onclick="saveTreeOrder()">保存排序</a><ahref="javascript:void(0)"class="easyui-linkbutton"iconCls="icon-reload"onclick="$('#dragTree').tree('reload')">刷新</a></div><!-- 关键:dnd:true 开启拖放功能 --><ulid="dragTree"class="easyui-tree"data-options="url:'get_menu_data.php', <!-- 可以静态标记或异步 --> animate:true, lines:true, dnd:true <!-- 开启拖拽 -->"><!-- 静态示例(如果不用异步) --><lidata-options="iconCls:'icon-setting'"><span>系统管理</span><ul><li><span>用户管理</span></li><li><span>角色管理</span></li><li><span>部门管理</span></li><li><span>菜单管理</span></li></ul></li><lidata-options="iconCls:'icon-product'"><span>商品管理</span></li><lidata-options="iconCls:'icon-order'"><span>订单管理</span></li><lidata-options="iconCls:'icon-report'"><span>报表统计</span></li></ul></div><script>// 保存拖拽后的树结构(常用:获取所有节点顺序和层级)functionsaveTreeOrder(){varroots=$('#dragTree').tree('getRoots');// 获取所有根节点vartreeData=[];$.each(roots,function(i,root){treeData.push(getNodeData(root));});console.log('拖拽后的树结构:',JSON.stringify(treeData,null,2));$.messager.alert('保存结果','<pre>'+JSON.stringify(treeData,null,2)+'</pre>','info');// 实际项目中:$.post('save_menu_order.php', {tree: treeData});}// 递归获取节点完整结构(id、text、children)functiongetNodeData(node){vardata={id:node.id||null,text:node.text,iconCls:node.iconCls};varchildren=$('#dragTree').tree('getChildren',node.target);if(children.length>0){data.children=[];$.each(children,function(j,child){data.children.push(getNodeData(child));});}returndata;}// 可选:拖拽事件监听$('#dragTree').tree({onDrop:function(target,source,point){// point: 'append'(作为子节点)、'top'(插入到上方)、'bottom'(插入到下方)console.log('节点 "'+source.text+'" 被拖放到 "'+$(target).parent().find('>span').text()+'" 的 '+point);},onBeforeDrop:function(target,source,point){// 可以在这里做限制,比如不允许某些节点拖拽// return false; // 阻止拖放returntrue;}});</script></body></html>

效果亮点:

  • 拖拽节点可移动到其他节点的上方、下方或作为子节点(三种放置方式)
  • 拖拽时有清晰的插入线提示(top/bottom/append)
  • 支持同级排序、跨层级移动(比如把“用户管理”拖到“商品管理”下面)
  • 拖完后调用saveTreeOrder()获取完整树结构,可直接保存到服务器

方法2:高级拖放控制(限制拖拽规则)

$('#dragTree').tree({dnd:true,onBeforeDrag:function(node){// 禁止拖拽某些节点(比如根节点)if(node.id==1){$.messager.alert('提示','根节点不允许拖拽!');returnfalse;}returntrue;},onBeforeDrop:function(target,source,point){vartargetNode=$('#dragTree').tree('getNode',target);// 禁止把自己拖到自己子节点里(避免死循环)if($('#dragTree').tree('isAncestor',source.target,target)){returnfalse;}// 只允许作为子节点(不允许同级排序)if(point!='append'){returnfalse;}// 只允许拖到有特定icon的节点下if(targetNode.iconCls!='icon-folder'){returnfalse;}returntrue;}});

方法3:行内拖拽排序(只允许同级排序,不允许跨层级)

onBeforeDrop:function(target,source,point){vartargetNode=$('#dragTree').tree('getNode',target);varsourceParent=$('#dragTree').tree('getParent',source.target);vartargetParent=$('#dragTree').tree('getParent',target);// 只允许同级拖拽(父节点相同)if(sourceParent&&targetParent&&sourceParent.target===targetParent.target){returnpoint=='top'||point=='bottom';// 只允许插入上下}returnfalse;}

方法4:两个树之间互相拖拽(跨树拖放)

<ulid="tree1"class="easyui-tree"data-options="dnd:true,url:'tree1.json'"></ul><ulid="tree2"class="easyui-tree"data-options="dnd:true,url:'tree2.json'"></ul><script>$('#tree1').tree({onDrop:function(target,source,point){// source.tree 表示来源树(如果是跨树拖拽)if(source.tree&&source.tree[0]!=this){// 从tree2拖到tree1$('#tree1').tree('append',{parent:target,data:[$.extend({},source)]// 复制节点数据});$(source.tree).tree('remove',source.target);// 从原树删除}}});</script>

你现在直接复制方法1的完整代码运行,就能看到一个支持自由拖拽排序的树形菜单了!
拖拽完成后点击“保存排序”就能获取完整的树结构JSON,完美用于菜单排序、部门调整、分类管理等场景。

想要我给你一个完整的示例(异步树 + 拖拽排序 + 限制规则 + 保存到服务器 + 拖拽提示美化)?
或者你告诉我你的具体需求(比如“只允许同级排序”“不允许拖到叶子节点”“拖拽后自动展开”),我2分钟发你精准代码,复制就能跑!

快说说你想怎么控制拖放,我手把手帮你搞定,5分钟内看到超级专业的树形菜单拖拽效果!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 4:10:02

jQuery EasyUI 树形菜单 - 创建基础树形网格

jQuery EasyUI 树形网格&#xff08;TreeGrid&#xff09; - 创建基础树形网格 jQuery EasyUI 的 TreeGrid&#xff08;树形网格&#xff09;是基于 DataGrid 扩展的组件&#xff0c;用于显示带有层级关系的表格数据。它结合了树视图&#xff08;Tree&#xff09;和可编辑网格…

作者头像 李华
网站建设 2026/4/13 8:00:14

jQuery EasyUI 树形菜单 - 树形网格添加分页

jQuery EasyUI 树形网格&#xff08;TreeGrid&#xff09; - 添加分页 jQuery EasyUI 的 TreeGrid 继承自 DataGrid&#xff0c;因此支持 pagination: true 属性来启用分页功能。但由于 TreeGrid 是层级结构&#xff0c;分页通常只针对顶级根节点进行&#xff08;子节点通过动…

作者头像 李华
网站建设 2026/4/13 13:02:46

Kotaemon如何应对文化差异?本地化适配策略分析

Kotaemon如何应对文化差异&#xff1f;本地化适配策略分析 在智能客服系统走向全球的今天&#xff0c;一个看似简单的用户提问——“我能不能退货&#xff1f;”——背后可能隐藏着巨大的文化鸿沟。在日本&#xff0c;这或许是一句含蓄的情绪表达&#xff1b;在德国&#xff0c…

作者头像 李华
网站建设 2026/4/11 16:57:05

IM即时通讯系统:安全可控、功能全面的社交解决方案全解析

在数字化社交时代&#xff0c;即时通讯&#xff08;IM&#xff09;系统已成为社交平台的核心基础设施。本文将深入解析开源IM系统的核心优势与功能亮点&#xff0c;为开发者提供一套安全可控、功能全面的社交解决方案。一、核心优势&#xff1a;安全与性能的双重保障1. 独立数据…

作者头像 李华
网站建设 2026/4/15 4:25:25

扭蛋机小程序开发制作!

扭蛋机便是盲盒的另一种形式&#xff0c;目前国内消费市场主要集中在互联网上&#xff0c;玩家在手机上就可以体验抽盲盒的乐趣&#xff0c;因此线上盲盒扭蛋机小程序的出现也是顺应市场发展。扭蛋机里面的盲盒商品一般是手办等&#xff0c;盲盒种类繁多&#xff0c;玩家可以抽…

作者头像 李华
网站建设 2026/4/8 21:32:29

英文论文写作工具推荐:8大AI+翻译润色排名+

英文论文写作工具推荐&#xff1a;8大AI翻译润色排名 &#xfffd;&#xfffd; 8款英文论文AI写作工具核心对比 工具名称 核心功能 处理速度 适合场景 独特优势 aibiye 降AIGC率查重 20分钟 学术论文优化 适配知网/维普检测规则 aicheck AIGC检测降重 20分钟 AI…

作者头像 李华