基于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 相关文章推荐
通过修改referer下载文件的方法
May 11 Javascript
几个比较经典常用的jQuery小技巧
Mar 01 Javascript
jquery DOM操作 基于命令改变页面
May 06 Javascript
js两行代码按指定格式输出日期时间
Oct 21 Javascript
计算世界完全对称日的js代码,粗糙版
Nov 04 Javascript
javascript通过class来获取元素实现代码
Feb 20 Javascript
JS冒泡事件的快速解决方法
Dec 16 Javascript
JS保留两位小数,多位小数的示例代码
Jan 07 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
Vue2.0子同级组件之间数据交互方法
Feb 28 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
Oct 26 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中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
Python中的__SLOTS__属性使用示例
2015/02/18 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python学习之用pygal画世界地图实例
2017/12/07 Python
Python Gitlab Api 使用方法
2019/08/28 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
小学生国旗下演讲稿
2014/04/25 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python