原生JS封装创建多级菜单函数

  手写一个使用原生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节点
      })
    }    

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

结束,别看了老铁,没了

原文地址:https://www.cnblogs.com/gitByLegend/p/10771733.html

时间: 2024-10-23 21:24:12

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

原生JS封装Ajax插件(同域&amp;&amp;jsonp跨域)

抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正确的地方,还望指正^_^ 一.Ajax核心,创建XHR对象 Ajax技术的核心是XMLHttpRequest对象(简称XHR),IE5是第一款引入XHR对象的浏览器,而IE5中的XHR对象是通过MSXML库中的一个ActiveX对象实现的,因此在IE中可能有3个版本,即MSXML2.XMLHttp.

原生JS封装AJAX

今天我们来说说利用原生JS封装AJAX. jquery框架的AJAX方法确实很好用,但有时候我们写的页面需要引入多个JS插件,不一定哪个插件就会和jquery发生冲突,导致jquery用不了了.或者页面比较简单,不需要加重浏览器的负担,这时我们自己封装一个AJAX就是一个很好的办法. //将数据转换成 a=1&b=2格式;function json2url(json){   var arr = [];   //加随机数防止缓存;   json.t = Math.random();   for(v

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

我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址的数组,图片宽度,上一页,下一页的id,图片列表即ul的id(这儿使用无序列表排列的图片),自动轮播间隔的时间.功能:实现了轮播的自动轮播,可以点击上一页,下一页进行切换. 下面是html中的代码,只需要把存放的容器写好,引入jquery即可: <!DOCTYPE html><html>

原生Js封装的弹出框

<!DOCTYPE HTML> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>原生Js封装的弹出框-弹出窗口-页面居中-多状态可选</title> <style type="text/css"&

用原生js封装轮播图

原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不懂的可以直接私信我 slide.js /* * 轮播图 */ function Slide(elem, ms, d, ind){ this.el = elem; this.w = parseInt(getStyle(elem, "width")); this.h = parseInt(ge

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

1. 前言 使用原生JS实现call和apply函数,充分了解其内部原理.call和apply都是为了解决改变this的指向.作用都相同,只是传参的方式不同.除了第一个参数外,call可以接受一个参数列表,apply只接受一个参数数组. 2. call函数 2.1 描述 call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数. 2.2 语法 fun.call(thisArg, arg1, arg2, ...) 2.3 参数 thisArg:可选的.在 fun 函数

java 24 - 7 GUI之 创建多级菜单窗体

需求: 创建多级菜单 步骤: A:创建窗体对象(并设置属性和布局) B:创建菜单栏 C:创建菜单和子菜单 D:逐步添加菜单(子菜单添加到菜单中,菜单添加到菜单栏中) E:窗体中设置菜单栏(菜单栏并不是添加,而是设置) F:设置各个菜单对应的监听事件 G:设置窗体关闭监听时间 H:设置显示窗口 代码: 1 public class FrameText4 { 2 3 public static void main(String[] args) { 4 5 // 创建窗体对象 6 final Fram

原生JS封装_new函数,实现new关键字的功能

一.前言 众所周知:没有对象怎么办?那就new一个! 那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢?现在我们就来剖析一下原生JS中new关键字内部的工作原理. 二.原始的new 首先,我们先new一个对象看看: 1 //创建Person构造函数,参数为name,age 2 function Person(name,age){ 3 this.name = name; 4 this.age = age; 5 } 6 //实例化对象小明 7 xm = new Person

原生JS 封装运动函数

在学原生JS之前,一直用jQuery 写运动,各种方便,但是不知其所以然,今天得空看了一个javascript 视频教程(这里不说了,以防广告的嫌疑),只能用一个词语形容之后的感觉-------醍醐灌顶. /* - obj 指的是DOM对象 - json 指的是 CSS样式 - 例 startMove(oDiv,{width:100,height:100},function(){}) */ function startMove(obj,json,fnEnd){ clearInterval(obj