手写一个使用原生JS封装的多级菜单的函数,满足以下几点需求。

  • 子类层级不确定,可根据数据自动生成多级菜单。
  • 操作便捷,只需传入一个HTML标签。
  缺点:
  • 需要满足特定的数据结构
  废话不多说,展示代码。先展示数据代码,注意,使用此封装函数需要满足此数据结构。
var data = [{
id: 1,
address: "安徽",
parent_id: 0
},
{
id: 2,
address: "江苏",
parent_id: 0
},
{
id: 3,
address: "合肥",
parent_id: 1
},
{
id: 4,
address: "庐阳区",
parent_id: 3
},
{
id: 5,
address: "大杨镇",
parent_id: 4
},
{
id: 6,
address: "南京",
parent_id: 2
},
{
id: 7,
address: "玄武区",
parent_id: 6
},
{
id: 8,
address: "梅园新村街道",
parent_id: 7
},
{
id: 9,
address: "上海",
parent_id: 0
},
{
id: 10,
address: "黄浦区",
parent_id: 9
},
{
id: 11,
address: "外滩",
parent_id: 10
},
{
id: 12,
address: "安庆",
parent_id: 1
}
];

  然后是HTML代码,提供一个DOM调用函数。

<div id="menu"></div>

  然后,就是我们封装的函数啦

  function ShowMenu(d) {
var root = document.querySelector(d); //获取DOM节点
var rootList = data.filter(rootItem => rootItem.parent_id == 0); //获取子元素数组
rootList.forEach(rootItem => { //循环子元素数组
var oDiv = document.createElement('div');
oDiv.setAttribute('data-id', rootItem.id);
oDiv.innerHTML = `${rootItem.address}`; function haschild(t) { //创建一个函数判断是否存在子元素
var child = data.filter(s => s.parent_id == t.dataset.id); //获取子元素数组
child.forEach(gs => { //循环子元素数组
var oUl = document.createElement('ul');
oUl.setAttribute('data-id', gs.id);
var oLi = document.createElement('li');
oLi.innerText = gs.address;
oUl.appendChild(oLi);
t.appendChild(oUl);
haschild(oUl); //再次调用函数,直到没有子元素存在
})
}
haschild(oDiv); //调用函数
root.appendChild(oDiv); //把所有的DOM放入传进来的DOM节点
})
}

  当当当当,又到了最振奋人心的时刻啦!调用函数。

结束,别看了老铁,没了

原生JS封装创建多级菜单函数的更多相关文章

  1. js cookie创建读取删除函数封装

    js cookie创建读取删除函数封装 一.总结 都是为了方便操作,这样弄了很方便 1.创建cookie的函数封装的作用:方便设置过期时间expire,方便设置键和值 2.查询cookie的数据封装的 ...

  2. 使用原生JS封装一个动画函数

    最近一直在忙项目,很少有时间回顾之前的知识,今天刚好要做一个轮播,因为对兼容性有一定的要求,使用了各种插件和库中的轮播,效果都不是很理想,一怒之下,使用原生JS封装了一个轮播组件,其中重要的功能就是一 ...

  3. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  4. 用jQuery基于原生js封装的轮播

    我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址 ...

  5. 原生Js封装的弹出框-弹出窗口-页面居中-多状态可选

    原生Js封装的弹出框-弹出窗口-页面居中-多状态可选   实现了一下功能: 1.title可自定义 可拖拽 2.width height可以自定义 3.背景遮罩和透明度可以自定义 4.可以自己编辑弹出 ...

  6. 基于原生JS封装数组原型上的sort方法

    基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...

  7. 原生JS实现call,apply,bind函数

    1. 前言 使用原生JS实现call和apply函数,充分了解其内部原理.call和apply都是为了解决改变this的指向.作用都相同,只是传参的方式不同.除了第一个参数外,call可以接受一个参数 ...

  8. 用原生js封装轮播图

    原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不 ...

  9. 原生JS封装简单动画效果

    原生JS封装简单动画效果 一致使用各种插件,有时候对原生JS陌生了起来,所以决定封装一个简单动画效果,熟悉JS原生代码 function animate(obj, target,num){ if(ob ...

随机推荐

  1. mongodb 性能

    mongo 性能:http://www.mongoing.com/docs/tutorial/optimize-query-performance-with-indexes-and-projectio ...

  2. 严重:one or more listeners failed. Full details will be found in the appropriate container log file

    one or more listeners failed. Full details will be found in the appropriate container log file   这句话 ...

  3. mysql授权用户,撤销用户,撤销权限基本操作

    进入mysql库 use mysql; mysql> select host,user from user; +-----------+---------------+ | host | use ...

  4. centos修改时区并同步时间

    查看服务器时间及所在时区 [root@localhost ~]# date -R Fri, 07 Dec 2018 04:38:28 -0500 修改时区 先使用 tzselect 根据提示选择所在地 ...

  5. java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

    当新对象被创建的时候,构造函数会被调用.每一个类都有构造函数.在程序中没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数 Java中构造函数重载和方法重载很相似.可以为一个类 ...

  6. 使用rsync在linux(客户端)拉取windows(服务端)数据

    windows 服务端ip:172.18.18.70 Linux客服端ip: 172.18.54.11 1.windows服务端下载cwRsync Server , 地址:https://www.ba ...

  7. cocos creator 无法打开项目 dock栏只显示图标问题解决方法

    1.打开项目 2.找到 library和local文件夹 3.清空这两个文件夹的数据 4.问题已解决 原因: 以前生成的旧数据会和新数据发生冲突,把生成的旧数据清理掉就OK了.

  8. 北京大学Cousera学习笔记--6-计算导论与C语言基础--计算机的基本原理-认识程序设计语言 如何学习

    1.是一门高级程序语言 低级语言-机器语言(二进制) 汇编语言-load add save mult 高级语言:有利于人们编写理解 2.C语言的规范定义非常的宽泛 1.long型数据长度不短于int型 ...

  9. tomcat 编码给为utf-8

    在tomcat下找到server.xml 打开server.xml,在下图加上URIEncoding="UTF-8".

  10. XML文件的读取

    <?xml version="1.0" encoding="gbk"?> <!--设置编码格式为gbk--> <!DOCTYPE ...