# tree **Repository Path**: qimui/tree ## Basic Information - **Project Name**: tree - **Description**: 树形插件 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 3 - **Created**: 2021-03-03 - **Last Updated**: 2024-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tree插件说明 ### 简单上手 ```aidl
树状菜单
``` ### 加载数据方式(loadAll) ```aidl var option={ data:[{ tree_id:0, tree_name:'name', tree_title:''; list:[...] },...], elem:'#main', //loadAll默认为true loadAll:false, //强制不生成id,若id不存在或为无效数据,null、undefined,则仍然会生成id compelCustom:true }; ``` ##### 若loadAll参数为true,则init时全部加载完成,若loadAll为false,则init时只加载一层。其余只会在节点展开时加载。若数据量大,则建议将该值设置为false ##### 注意:该参数不会影响checkbox选项,选中全部即选中全部,包含未加载到dom树上的节点。 ###### id生成方式:理论上整个tree插件只能存在一个id,不可出现重复id,但为了更好的适应项目中,id可用户自定义,即下面会介绍到的format参数。为了保证id唯一性,将会在生成节点时,判断节点中是否已经含有该id,若id存在,则会自动生成一个唯一id。可通过compelCustom参数指定强制不生成id,但是如果节点数据内的id属性不存在,则仍会自动生成一个id给该节点。 ###### 因此,为了checkbox组件获取选中节点的效率,若剩余的节点若没有加载到dom树中,id如果出现重复,不会重新生成,则获取到的选中节点的数量会改变。 ### 数据源json数组参数列表 | 参数名 | 类型 | 默认值 | 示例 | 描述 | | --- | --- | --- | --- | --- | | name | string | 节点 | "父类" | 显示在外面的文字 | | id | object | 自动生成,从0开始 | 1 | 标识,可通过下面的getNodeById(方法获取节点)| |title | string | 与name属性一致|"这是描述"|鼠标悬浮在节点上的描述文字 |unfold | boolean|false|true|如果为true,则该节点下面的子节点展开,且父节点也会展开| |data|object|无|"这是数据"|保存在节点上的数据,每次节点触发事件的回调都会将该字段的内容传入| |type|boolean或string|false|true或folder或false|表示该节点是否为文件夹节点| |hide|boolean|false|true|表示改节点是否隐藏,如果为true,则该节点与该节点下的所有子节点都会隐藏| |childs|array|[]|[{name:'...',...}]|该节点下面的子节点,格式与此表数据格式一致,理论上可套用无限层,但可能造成浏览器堆栈溢出。| 如果数据源的参数名与默认的参数名不一致,则需在option内加入format参数,该参数的调用在init方法之前,可通过更改传入的format参数进行更改 若后续数据需要更改,则可在调用addNode方法之前,通过 ```tree.format.属性名```的方式设置对应参数名,也可以通过保存format对象,后续更改format对象进行修改 ### 自定义data格式(format) ```aidl //示例 var option={ data:[{ tree_id:0, tree_name:'name', tree_title:''; list:[...] },...], elem:'#main', format:function (format){ //数据源代表id的参数名 format.id='tree_id'; //若想要将该节点所有内容全部作为data(子节点的数据除外),需要将format.data的值设置为all format.data='all'; format.name='tree_name'; format.title='tree_title'; format.childs='list'; } } ``` ##### 注意:若无其他需求,尽量不要在外面修改format值,以防止数据错误 ### 对接接口异步获取数据(async、loadText) ```aidl //示例 var option = { async:{ //设置url url:'http://10.0.42.220:8090/test/treeTest', method:'GET',//请求方式 data:'需要传过去的数据' }, elem: '#main', loadText:''//加载阶段显示的文字,可设置为图片或其他 ... } ``` ### 工具栏(toolbar、toolClick) ```aidl var option = { data:[{ tree_id:0, tree_name:'name', tree_title:''; list:[...] },...], toolbar:false, toolClick:function (type,node){ //type为预设的点击按钮类型,node为该节点返回的对象 }, //文件夹工具栏,可定义多个,可不填写,默认三个按钮[添加、修改、删除],文件工具栏则只有[修改、删除] foldTools:[{'name':'删除',"title":'删除该节点',type:'delete'}], //文件工具栏,可不填写,默认与文件夹工具栏一直 tools:[{'name':'删除',"title":'删除该节点',type:'delete'}] ... } //由于iE浏览器显示的工具栏是乱码的,因此如果是ie浏览器,则关闭工具栏 if(window.ActiveXObject || "ActiveXObject" in window){ option.toolbar=false; } ``` ### 复选框(checkbox) ```aidl var option = { data:[{ tree_id:0, tree_name:'name', tree_title:''; list:[...] },...], checkbox:true ... } //获取所有选中的id,如果子节点全部选中,则包括父节点的也全部选中 tree.getChecked() ``` ### 模板化(templet数据前置处理) ```aidl var option = { data:[{ tree_id:0, tree_name:'name', tree_title:''; list:[...] },...], template:function(data){ //在这里改变data的值,改变之后会同步更新到节点上去 } ... } ``` ### 事件监听回调(fold、unfold、Event) ```aidl var option={ unfold:function (node,tree){ //这里写收缩后的回调内容 },fold:function (node,tree){ //这里写展开后的回调内容 },prevFold:function (node,tree){ //这里写展开前的回调内容 },loadCallBack:function (tree){ //这里写异步加载完成之后的回调内容 },node_click:function(node,tree){ //这里写子节点点击之后的回调,不包括文件夹 },node_dbclick:function(node,tree){ //这里写子节点双击之后的回调,不包括文件夹 },node_mouseleave:function(node,tree){ //这里写子节点悬浮之后的回调,不包括文件夹 },node_mouseenter:function(node,tree){ //这里写子节点悬浮离开之后的回调,不包括文件夹 },folder_click:function(node,tree){ //这里写文件夹点击之后的回调,不包括子节点 },folder_dbclick:function(node,tree){ //这里写文件夹双击之后的回调,不包括子节点 },folder_mouseleave:function(node,tree){ //这里写文件夹悬浮之后的回调,不包括子节点 },folder_mouseenter:function(node,tree){ //这里写文件夹悬浮离开之后的回调,不包括子节点 },gm_click:function(node,tree){ //这里写点击之后的回调,包括子节点 },gm_dbclick:function(node,tree){ //这里写双击之后的回调,包括子节点 },gm_mouseleave:function(node,tree){ //这里写悬浮之后的回调,包括子节点 },gm_mouseenter:function(node,tree){ //这里写悬浮离开之后的回调,包括子节点 } elem: '#main', ... } ``` 以上所有的node为触发事件的node对象,tree为树对象 ### 可调用的方法 |方法名 |参数|示例 |返回内容|
示例
|
描述
|
参数详解
| |---|---|---|---|---|---|---| |init|无|init()|无|无|创建节点并初始化,执行完毕后调用加载回调,只调用一次,否则会出现重复数据,异步加载数据时无需调用| |getNodeById|id|getNodeById(0)|Node|\
\...(dom节点)|通过id获取节点,即使id重复,也仅返回第一个id,查找id的顺序为父节点--父节点下第一个子节点--父节点下第二个子节点...--第一个子节点下的子节点1...第二个子节点下的子节点...-- |addNodeByInterface|node,option,func|addNodeByInterface(getNodeById(0),{async},true,{回调函数})|无|无|通过调用接口创建节点|node:要追加到的节点,需要使用getNodeById()方法获取。option:与异步加载数据的async参数一致。func:加载完成之后的回调函数 |addNode|node,datas|addNode(getNodeById(0),data,true)|无|无|直接将数据加载到指定节点下|node:略,nodes:与同步加载的data参数一致 |nodeUnfold|node,call,unfold|nodeUnfold(getNodeById(0),false,true)|无|无|将指定节点闭合,执行此操作之后,此节点下所有文件夹全部闭合|node:略,call:是否调用展开回调函数,unfold:是否强制指定节点的文件夹图标为展开 |nodeFold|node,call|nodeUnfold(getNodeById(0),false)|无|无|将指定节点打开|参数与nodeFold方法内参数一致 |hasChild|node|hasChild(getNodeById(0))|boolean|true|获取指定节点是否有子节点|略 |foldAll|node|foldAll(getNodeById(0))|无|无|展开指定节点下所有子节点|略 |addEventListener|elem,type,func|addEventListener(getNodeById(0).elem,'click',{回调函数})|无|无|绑定一个节点的指定事件|elem:Node对象的elem属性,type:事件名称,func:回调函数 |showHide|无|showHide()|无|无|将隐藏的节点显示出来| |getChecked|无|getChecked()|Set|["1","2"]|返回所有选中的节点的id| |checkClick|node|checkboxClick(getNodeById(0))|无|无|复选框点击事件 |reload|option|reload(option/不填写)|无|无|重新加载数据,插件的最外层div不会重新创建。建议只重新加载数据时调用此方法,否则可能存在丢失事件或其他情况,其他情况建议重新创建对象|参数与创建对象时一致,可为空,若为空则数据重新加载,其他不变 |clear|node|clear(node/不填写)|无|无|清空指定节点下所有子节点|node为空则移除所有 |remove|node|remove(node/不填写)|无|无|移除指定节点|node为空则移除所有 |属性名|类型|示例|描述| |---|---|---|---| |timeOut|int|100|设置单击按钮响应相隔时长(单双击区分时使用) |format|json|format.id='cid'|格式化data的属性名,见参数的format参数 上述方法与属性均需要用实例化的对象去调用。其他方法尽量不要调用,其他方法不通用 ### Node对象 |属性名/方法名|类型|返回类型|示例|描述| |---|---|---|---|---| |id|属性|int|1|该节点id |isParent|属性|boolean|true|判断是否为父节点 |data|属性|json|{id:"1"...}|该节点的原始数据 |elem|属性|dom节点|
...|该节点的dom树元素,该div为显示字的div |name|属性|string|节点1|该节点显示字符 |title|属性|string|节点1|该节点title属性字符 |checked|方法|boolean|true|获取该节点是否被选中 |childs|方法|数组|[Node...]|返回该节点所有子类,第一次调用会找一遍,第二次再调用该对象的childs()方法将直接返回 |parent|方法|Node对象|Node|返回该节点的父类,与childs方法一致 |next|方法|Node对象|Node|返回该节点下一个兄弟节点 |prev|方法|Node对象|Node|返回该节点上一个兄弟节点 |hasChild|方法|boolean|true|返回该节点是否含有子节点 |foldAll|方法|无|无|展开该节点下的所有节点,包括子节点(同tree的foldAll方法) |addEventListener|方法|无|无|添加该节点的指定事件 |check|方法|无|无|模拟该节点的选中事件 |addNode|方法|无|无|在该节点下添加子节点(同tree的addNode方法) |addNodeByInterface|方法|无|无|在该节点下通过接口添加子节点(同tree的addNodeByInterface方法) |clear|方法|无|无|清空该节点下所有子节点 |remove|方法|无|无|移除该节点 |fold|方法|无|无|收缩该节点 |unFold|方法|无|无|展开该节点 以上说明内含有(同tree的XXX方法)的均为调用tree对应方法,详细用法请去tree的所有方法内查看 ## 可扩展性 如需修改ui,请重新创建一个css样式,在引用tree.css后,引用重写的样式,调试完成之后可不引用tree.css 如需修改图片,则需先在img目录下新建一个文件夹,然后在这个文件夹内放入引用的图片,将图片改名为default目录相应的名字, 如不能改名,则需将tree.js文件,Icon属性下面url的文件名更改成相应的名字,最后在调用前,或直接修改tree.js文件下ui的值 为相应的文件夹名称 若图标显示不出来,更改tree.js文件下baseUrl的值即可。 ## 兼容性 |浏览器 | 兼容性|备注| |---|---| ---| |IE| IE9 以上(包含)|工具栏在ie样式会变乱,不建议在IE打开工具栏选项 |谷歌|支持| |火狐|支持| |360|支持| |Edge|支持| |搜狗浏览器|支持| |QQ浏览器|支持| ## 压缩说明 若后续有更新但压缩文件的未更新,请前往[https://tool.css-js.com/](https://tool.css-js.com/),在该网页上压缩之后替换即可 本插件所有压缩均为该网站压缩