基于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 相关文章推荐
JS 建立对象的方法
Apr 21 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
Feb 05 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
Apr 28 Javascript
js实现文件上传表单域美化特效
Nov 02 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
JS遍历页面所有对象属性及实现方法
Aug 01 Javascript
详解如何较好的使用js
Dec 16 Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 Javascript
vue页面切换过渡transition效果
Oct 08 Javascript
vue多页面项目中路由使用history模式的方法
Sep 23 Javascript
使用Vue实现调用接口加载页面初始数据
Oct 28 Javascript
Javascript如何递归遍历本地文件夹
Aug 06 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
谈谈关于php的优点与缺点
2013/04/11 PHP
php设计模式之委托模式
2016/02/13 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
python计算书页码的统计数字问题实例
2014/09/26 Python
简洁的十分钟Python入门教程
2015/04/03 Python
python得到windows自启动列表的方法
2018/10/14 Python
详解python 中in 的 用法
2019/12/12 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
python openCV自制绘画板
2020/10/27 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
零件设计自荐信范文
2013/11/27 职场文书
机电一体化自荐信
2013/12/10 职场文书
工程资料员岗位职责
2014/03/10 职场文书
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python