基于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基础知识大全 便于大家学习,也便于我自己查看
Aug 17 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
Aug 07 Javascript
JavaScript中的闭包(Closure)详细介绍
Dec 30 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
Feb 28 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
详解Vue 动态添加模板的几种方法
Apr 25 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
微信小程序实现留言功能
Oct 31 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
JS开发常用工具函数(小结)
Jul 04 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
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python中存取文件的4种不同操作
2018/07/02 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
Python Django 命名空间模式的实现
2019/08/09 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
商业活动邀请函
2014/02/04 职场文书
社区工作感言
2014/02/21 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis