基于JavaScript实现树形下拉框


Posted in Javascript onAugust 10, 2016

平时会经常遇到树形结构的问题,比如显示目录结构等。

大多数情况下后台会返回这样的数据,如下:

[
{ id: 19, pid: 0, name: 'nodejs' },
{ id: 20, pid: 19, name: 'express' },
{ id: 21, pid: 19, name: 'mongodb' },
{ id: 60, pid: 20, name: 'ejs' },
{ id: 59, pid: 0, name: '前端开发' },
{ id: 70, pid: 59, name: 'javascript' },
{ id: 71, pid: 59, name: 'css' },
{ id: 72, pid: 59, name: 'html' },
{ id: 73, pid: 59, name: 'bootstrap' },
{ id: 61, pid: 0, name: '视觉设计' },
{ id: 63, pid: 61, name: '网页设计' },
]

这种数据结构后台容易处理,但是前台不好处理,需要首先将其转成树形json数据,如下:

[
{ id: 19, pid: 0, name: 'nodejs',
 children:[
   { id: 20, pid: 19, name: 'express',children:[{ id: 60, pid: 20, name: 'ejs' }]},
   { id: 21, pid: 19, name: 'mongodb' }
   ]
},
{ id: 59, pid: 0, name: '前端开发',
 children:[
  { id: 70, pid: 59, name: 'javascript' },
  { id: 71, pid: 59, name: 'css' },
  { id: 72, pid: 59, name: 'html' },
  { id: 73, pid: 59, name: 'bootstrap' }
   ]
},
{ id: 61, pid: 0, name: '视觉设计',children:[{ id: 63, pid: 61, name: '网页设计' }]},
]

这样就可以很方便的是用递归构建树形的组件。

如果后台能够直接返回这种结构最好,不然前台需要做转换。

一、将list数组结构的数据转成tree结构json

//list 转成树形json
function listToTree(list,pid) {
var ret = [];//一个存放结果的临时数组
for(var i in list) {
if(list[i].pid == pid) {//如果当前项的父id等于要查找的父id,进行递归
 list[i].children = listToTree(list, list[i].id);
 ret.push(list[i]);//把当前项保存到临时数组中
}
}
return ret;//递归结束后返回结果
}

var tree=listToTree(list,0);//调用函数,传入要转换的list数组,和树中顶级元素的pid

console.log(tree);

二、根据tree结构json数据生成下拉框

//在网页中添加下拉框容器
<select id="selectbox" name=""></select>
//js脚本,递归生成
//获取容器对象
var selectbox=document.getElementById("selectbox");

//生成树下拉菜单
var j="-";//前缀符号,用于显示父子关系,这里可以使用其它符号
function creatSelectTree(d){
 var option="";
 for(var i=0;i<d.length;i++){
 if(d[i].children.length){//如果有子集
  option+="<option value='"+d[i].id+"'>"+j+d[i].name+"</option>";
 j+="-";//前缀符号加一个符号
  option+=creatSelectTree(d[i].children);//递归调用子集
 j=j.slice(0,j.length-1);//每次递归结束返回上级时,前缀符号需要减一个符号
  }else{//没有子集直接显示
  option+="<option value='"+d[i].id+"'>"+j+d[i].name+"</option>";
  }
  }
 return option;//返回最终html结果
 }

//调用函数,并将结构出入到下拉框容器中
selectbox.innerHTML=creatSelectTree(tree);

如果大家还想深入学习,可以点击jquery下拉框效果汇总、JavaScript下拉框效果汇总进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 面向对象 对象(Object)
May 13 Javascript
jQuery对表单的操作代码集合
Apr 06 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
Mar 16 Javascript
js自定义事件及事件交互原理概述(一)
Feb 01 Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 Javascript
jquery选择器-根据多个属性选择示例代码
Oct 21 Javascript
input禁止键盘及中文输入,但可以点击
Feb 13 Javascript
jquery uploadify 在FF下无效的解决办法
Sep 26 Javascript
js仿3366小游戏选字游戏
Apr 14 Javascript
详解VueJs前后端分离跨域问题
May 24 Javascript
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
关于原生js中bind函数的简单实现
Aug 10 #Javascript
Mvc提交表单的四种方法全程详解
Aug 10 #Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 #Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
Aug 10 #Javascript
浅谈jQuery中的checkbox问题
Aug 10 #Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
Aug 10 #Javascript
Three.js学习之网格
Aug 10 #Javascript
You might like
PHP学习 运算符与运算符优先级
2008/06/15 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
JavaScript全局函数使用简单说明
2011/03/11 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
Vue自定义指令详解
2017/07/28 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
实例讲解Python中函数的调用与定义
2016/03/14 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
详细分析python3的reduce函数
2017/12/05 Python
Python实现按中文排序的方法示例
2018/04/25 Python
Linux下python制作名片示例
2018/07/20 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
深入了解NumPy 高级索引
2020/07/24 Python
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
关于打架的检讨书
2014/01/17 职场文书
涨价通知
2015/04/23 职场文书
2016年寒假生活小结
2015/10/10 职场文书
交通安全学习心得体会
2016/01/18 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js