JS实现级联菜单

JS实现级联菜单

使用vscode快速创建html

1.在一个目录中新建html文件

点击文件夹旁文件带+的icon
在这里插入图片描述

2.填写文件名

XXX.html或者XXX.htm都可以
在这里插入图片描述

3.快速初始化html

打开创建的html文件
文件开头输入 ! 此时vscode会有提示(注意中英文,英文的!才可以)
在这里插入图片描述

出现提示时,按下 tab 键,vscode会自动生成基础的的html标签
在这里插入图片描述

设置建议下拉框

1.创建三个下拉框

使用select标签创建下拉框,select标签中增加id、name属性方便后续使用,select标签下增加option标签增加下拉框选项,第二和第三个下拉框,设置了内联样式display:none默认不显示。
在这里插入图片描述

2.预览html

点击vscode菜单栏【运行】,点击【启用调试】, 选择【chrome】,没用谷歌浏览器可以用window10的edge,或者选择更多安装其他调试环境
在这里插入图片描述
在这里插入图片描述
这是浏览器就会显示如下的网页
在这里插入图片描述

通过js对下拉框进行联动操作

1.在body标签下方添加script标签

在这里插入图片描述

2.添加变量,将数组赋值给变量

使用var关键字可以声明变量, []代表列表,列表中值使用【,】隔开,字符串使用【’】包裹,一定要注意数组的层级不然会影响后续功能
在这里插入图片描述

3.通过DOM获得网页中元素

使用document.getElementById(‘id’)方法,括号中填入前面select标签中设置的id就可以获得select元素,并将获取到的元素赋值给创建的变量
在这里插入图片描述

4.创建方法操作第二和第三个下拉框

xx.selectedIndex 下拉框选中选项的下标,从0开始
xx.removeChild()设置元素下内容,设置为空则清除内容
xx.children.length 子元素数量
var option = new Option() 创建option标签
xx.setAttribute(‘style’, “display: block;”) 设置元素的属性,直接替换原有属性
xx.appendChild()向该元素下添加子元素
doucument.createTextNode() 创建文本元素节点
在这里插入图片描述

在这里插入图片描述

5.使用for in循环遍历第一个数组,并初始化第一个select下拉框

每次循环新增一个option标签,并把数组的每个值放入option中,再把option加入到select标签下
Option() 创建option标签
xx.appendChild()给元素添加子元素
document.createTextNode()设置文本信息
在这里插入图片描述

6.通过时间监听方法初始化第二、第三个select下拉框

使用事件监听方法,当下拉框发生改变时,则调用匿名方法,匿名方法调用之前设置的方法初始化第二、第三个下拉框,同时判断如果选中的是第一个下拉框默认的选项则不发生变化
xx.addEventListener(‘mode’, function(){}) 给元素增加事件监听方法,发生对应事件则调用后续函数
在这里插入图片描述

至此我们已经实现了通过js实现级联菜单的功能,下面来实现标题的自动变化

根据下拉选择改变标题

1.新增一个变量获取标题元素

在这里插入图片描述

2.新增在原有的两个方法上添加修改标题的功能

在这里插入图片描述
在这里插入图片描述

3.新增一个方法来修改第三个下拉框选择时标题的修改

在这里插入图片描述

4.给第三个下拉框添加事件监听来改变标题

在这里插入图片描述

源码展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=<device-width>, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 设置一个菜单标题 -->
    <p id="menuInfo">城市   ></p>
    <!-- 使用br标签换行显示 -->
    <br>
    <!-- 创建三级联动菜单并分别设置id -->
    <select name="firstMenu" id="firstMenu">
        <option>firstMenu</option>
    </select>
    <select name="seceondMenu" id="seceondMenu" style="display: none;">
        <option>seceondMenu</option>
    </select>
    <select name="thirdMenu" id="thirdMenu" style="display: none;">
        <option>thirdMenu</option>
    </select>
</body>
<script>
    // 创建变量存放数组
    var firstMenuItem = ['北京市', '天津市', '江苏省', '浙江省', '广东省', '黑龙江省']
    var seceondMenuItem = [['北京市'], ['天津市'], ['南京市', '苏州市', '无锡市'], ['杭州市', '丽水市'], ['广州市'], ['哈尔滨市']]
    var thirdMenuItem = [[['北京市']], [['天津市']], [['鼓楼区', '江宁区', '建邺区'], ['虎丘区', '吴中区'], ['惠山区']], [['萧山区', '西湖区']], [['莲都区']], [['越秀区']], [['松北区']]]
    // 通过DOM操作获取html元素
    var firstMenu = document.getElementById('firstMenu')
    var seceondMenu = document.getElementById('seceondMenu')
    var thirdMenu = document.getElementById('thirdMenu')
    // 获得标题元素
    var title = document.getElementById('menuInfo')

    // 创建方法对第二个下拉框进行操作
    function firstMenuChange(){
        // 初始化前清除除默认外所有选项
        if (seceondMenu.children.length > 1){//不清楚默认选项
            // 获取当前子节点长度(删除节点后长度会变化,会导致漏删)
            num = seceondMenu.children.length
            for (let index = 1; index < num; index++) {
                // 每次删除最有一个节点
                seceondMenu.removeChild(seceondMenu.children[seceondMenu.children.length-1])
            }
        }
        // 如果firstMenu选中的不是第一个选下则初始化seceondMenu
        if (firstMenu.selectedIndex != 0 ){
            // 获取当前标题文本信息
            nowText = '城市   >'
            // 根据第一个标题选项和原标题进行拼接格式化组成新标题文本信息
            newText = nowText + '   '+ firstMenu.children[firstMenu.selectedIndex].textContent
            // 将新标题文本信息替换原有信息
            title.textContent = newText
            // 获取第一个选项的下标,以此来从第二个多维数组中查找到对应数组
            for (const key in seceondMenuItem[firstMenu.selectedIndex - 1]) {
                var option = new Option()
                option.appendChild(document.createTextNode(seceondMenuItem[firstMenu.selectedIndex - 1][key]))
                seceondMenu.appendChild(option) 
            }
            // 将seceondMenu设置为显示
            seceondMenu.setAttribute('style', "display: block;")
        }else{
            // 选中默认选项将seceondMenu、thirdMenu设置为不显示
            seceondMenu.setAttribute('style', "display: none;")
        }
    }

    // 创建方法对第三个下拉框进行操作
    function seceondMenuChange(){
        // 初始化前清除除默认外所有选项
        if (thirdMenu.children.length > 1){
            // 获取当前子节点长度(删除节点后长度会变化,会导致漏删)
            num = thirdMenu.children.length
            for (let index = 1; index < num; index++) {
                // 每次删除最有一个节点
                thirdMenu.removeChild(thirdMenu.children[thirdMenu.children.length-1])
            }
        }
        // 如果seceondMenu选中的不是第一个选下则初始化thirdMenu
        if (seceondMenu.selectedIndex != 0 ){
            // 获取当前标题文本信息
            nowText = title.textContent
            // 根据第一个标题选项和原标题进行拼接格式化组成新标题文本信息
            newText = nowText + '   >   '+ seceondMenu.children[seceondMenu.selectedIndex].textContent
            // 将新标题文本信息替换原有信息
            title.textContent = newText
            // 获取第一个、第二个选项的下标,以此来从第三个多维数组中查找到对应数组
            for (const key in thirdMenuItem[firstMenu.selectedIndex - 1][seceondMenu.selectedIndex - 1]) {
                var option = new Option()
                option.appendChild(document.createTextNode(thirdMenuItem[firstMenu.selectedIndex - 1][seceondMenu.selectedIndex - 1][key]))
                thirdMenu.appendChild(option)
            }
            // 将seceondMenu设置为显示
            thirdMenu.setAttribute('style', "display: block;")
        }else{
            // 选中默认选项将seceondMenu、thirdMenu设置为不显示
            thirdMenu.setAttribute('style', "display: none;")
        }
    }

    // 创建方法对第三个下拉框进行操作
    function thirdMenuChage(){
        if (thirdMenuChage.selectedIndex != 0 ){
            // 获取当前标题文本信息
            nowText = title.textContent
            // 根据第一个标题选项和原标题进行拼接格式化组成新标题文本信息
            newText = nowText + '   >   '+ seceondMenu.children[seceondMenu.selectedIndex].textContent
            // 将新标题文本信息替换原有信息
            title.textContent = newText
        }
    }


    // 使用for in 循环遍历数组
    for (const key in firstMenuItem) {
        // 创建新option标签
        var option = new Option()
        // 将数组中值加入option中
        option.appendChild(document.createTextNode(firstMenuItem[key]))
        // 在firstMenu下拉框中插入option
        firstMenu.appendChild(option)
    }


    // 为firstMenu添加时间侦听,类型change,执行匿名方法,同时操作第二、第三个下拉框
    firstMenu.addEventListener('change', function(){
        firstMenuChange()
        seceondMenuChange()
    });

    
    // 为seceondMenu添加时间侦听,类型change,执行匿名方法操作第三个下拉框
    seceondMenu.addEventListener('change', function(){
        seceondMenuChange()
    })

    // 为seceondMenu添加时间侦听,类型change,执行匿名方法操作第三个下拉框
    thirdMenu.addEventListener('change', function(){
        thirdMenuChage()
    })
</script>
</html>
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 JavaScript 和 HTML 来实现级联菜单。首先,你需要创建一个包含所有选项的数组,然后使用 JavaScript 动态地创建下拉菜单。当用户选择第一个下拉菜单中的选项时,使用 JavaScript 更新第二个下拉菜单中的选项。具体实现方法可以参考以下代码: HTML 代码: ``` <select id="firstMenu" onchange="updateSecondMenu()"> <option value="">请选择</option> <option value="option1">选项1</option> <option value="option2">选项2</option> <option value="option3">选项3</option> </select> <select id="secondMenu"> <option value="">请选择</option> </select> ``` JavaScript 代码: ``` var menuOptions = { option1: ["子选项1", "子选项2", "子选项3"], option2: ["子选项4", "子选项5", "子选项6"], option3: ["子选项7", "子选项8", "子选项9"] }; function updateSecondMenu() { var firstMenu = document.getElementById("firstMenu"); var secondMenu = document.getElementById("secondMenu"); var selectedOption = firstMenu.options[firstMenu.selectedIndex].value; while (secondMenu.options.length) { secondMenu.remove(); } var menuItems = menuOptions[selectedOption]; if (menuItems) { var i; for (i = ; i < menuItems.length; i++) { var menuItem = new Option(menuItems[i], i); secondMenu.options.add(menuItem); } } } ``` 在这个例子中,我们创建了一个名为 menuOptions 的对象,其中包含了每个选项的子选项。当用户选择第一个下拉菜单中的选项时,我们使用 updateSecondMenu 函数来更新第二个下拉菜单中的选项。我们首先获取第一个下拉菜单和第二个下拉菜单的元素,然后获取用户选择的选项。接着,我们清空第二个下拉菜单中的选项,并根据用户选择的选项更新第二个下拉菜单中的选项。最后,我们将新的选项添加到第二个下拉菜单中。 ### 回答2: JavaScript级联菜单实现可以通过以下步骤进行: 1. 首先,在HTML文件中创建一个容器元素,用来容纳级联菜单。例如: ``` <div id="menu"></div> ``` 2. 在JavaScript代码中定义一个包含菜单选项的数据结构。这可以是一个嵌套的对象或数组,每个选项都包含一个值和一个与之关联的子选项数组,例如: ``` var menuData = [ { value: "选项1", children: [ { value: "子选项1-1" }, { value: "子选项1-2" } ] }, { value: "选项2", children: [ { value: "子选项2-1" }, { value: "子选项2-2" } ] } ]; ``` 3. 创建一个函数来动态生成级联菜单。该函数应该接受一个父级菜单选项作为参数,并在该选项下生成子菜单。例如: ``` function generateMenu(parent) { var menu = document.createElement("select"); // 为菜单添加选项 for (var i = 0; i < parent.children.length; i++) { var option = document.createElement("option"); option.text = parent.children[i].value; option.value = i; menu.appendChild(option); } // 为菜单添加事件监听器 menu.addEventListener("change", function() { var selectedIndex = menu.options[menu.selectedIndex].value; if (parent.children[selectedIndex].children) { generateMenu(parent.children[selectedIndex]); } }); // 将菜单添加到容器元素中 document.getElementById("menu").appendChild(menu); } ``` 4. 最后,在JavaScript中调用`generateMenu`函数来初始化级联菜单。例如: ``` generateMenu({ children: menuData }); ``` 以上就是实现JavaScript级联菜单的基本步骤。你可以根据需要自定义菜单的样式和交互行为。 ### 回答3: JavaScript级联菜单实现是通过动态改变下拉菜单选项的方法来实现的。下面是一个简单的例子,说明如何使用JavaScript实现级联菜单。 首先,我们需要创建HTML结构,包括一个用于选择的父级下拉菜单和一个用于显示子级下拉菜单的元素。如下所示: ```html <select id="parentMenu" onchange="changeChildMenu()"> <option value="">请选择父级菜单</option> <option value="1">菜单1</option> <option value="2">菜单2</option> <option value="3">菜单3</option> </select> <div id="childMenu" style="display: none;"> <select id="childSelect"> <option value="">请选择子级菜单</option> </select> </div> ``` 接下来,我们需要编写JavaScript代码来实现级联菜单的效果。我们可以使用`change`事件来监听父级下拉菜单的变化,并根据所选值来动态改变子级下拉菜单的选项。如下所示: ```javascript function changeChildMenu() { var parentValue = document.getElementById('parentMenu').value; var childSelect = document.getElementById('childSelect'); // 清空子级下拉菜单的选项 childSelect.innerHTML = '<option value="">请选择子级菜单</option>'; // 根据所选值动态添加子级下拉菜单的选项 if (parentValue === '1') { childSelect.innerHTML += '<option value="11">子菜单1</option>'; childSelect.innerHTML += '<option value="12">子菜单2</option>'; } else if (parentValue === '2') { childSelect.innerHTML += '<option value="21">子菜单3</option>'; childSelect.innerHTML += '<option value="22">子菜单4</option>'; } else if (parentValue === '3') { childSelect.innerHTML += '<option value="31">子菜单5</option>'; childSelect.innerHTML += '<option value="32">子菜单6</option>'; } // 显示子级下拉菜单 document.getElementById('childMenu').style.display = 'block'; } ``` 在上面的代码中,我们使用了`innerHTML`属性来动态改变子级下拉菜单的选项。根据所选的父级菜单的值,我们通过添加新的`option`元素来动态改变子级菜单的选项。 最后,通过调用`changeChildMenu()`函数,我们可以在父级下拉菜单的选项改变时触发级联效果。 以上就是用JavaScript实现级联菜单的基本步骤。根据实际需求,你可以修改代码来适应不同的菜单结构和选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值