You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

98 lines
3.9 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!-- 生成的dom结构 -->
<div id="demo">
<!-- 添加内容 -->
</div>
<!-- 原生 -->
<div>
<div class="title">原生select</div>
<select>
<option value="1" type="构建工具">Babel</option>
<option value="2" type="构建工具">Webpack</option>
<option value="3" type="构建工具">Rollup</option>
<option value="4" type="前端框架">Vue</option>
<option value="5" type="前端框架">Angular</option>
<option value="6" type="前端框架">React</option>
<option value="7" type="前端框架">Nerv</option>
</select>
</div>
<script>
// 用于存放分类后的结果
let classify = {};
// 获取所有的option选项
let allOption = document.querySelectorAll('option')
// 遍历所有的选项,
for (let i = 0; i < allOption.length; i++) {
// 获取每一个option选项的type属性值
const type = allOption[i].getAttribute('type');
// 获取每一个option选项的value属性值
const value = allOption[i].getAttribute('value');
// 获取每一个option选项的文本内容
const text = allOption[i].innerText
// 判断是否存在该类型 不存在则置为空数组,然后才可以将同类型的数据添加进去
if (!classify[type]) {
classify[type] = [];
}
// 将每一项放入对应类型的数组
/**
* 因为每循环一次,没有option选项都有对应的type和值,示例:
* 第一次循环 type = "构建工具" value ="1" text = "Babel" 那么就是 classify["构建工具"] = [{value:1,text:'Babel'}]
* 第二次循环 type = "构建工具" value ="2" text = "Webpack" 那么就是 classify["构建工具"] = [{value:1,text:'Babel'},{value:2,text:'Webpack'}]
* .....依次类推
* 最后一次循环 type = "前端框架" value ="7" text = "Nerv" 那么就是 classify["前端框架"] = [ {value: "前端框架", text: "Vue"},
* {value: "前端框架", text: "Angular"},
* {value: "前端框架", text: "React"},
* {value: "前端框架", text: "Nerv"}]
*/
classify[type].push({
value,
text
})
}
console.log(classify)
// 动态创建下拉列表
function createElement(classify) {
// 获取最外层的容器
let wrap = document.getElementById('demo')
// 先设置内容,添加input输入框
wrap.innerHTML = "<input type'text'>"
// 遍历生成的数据
for (let [key, value] of Object.entries(classify)) {
/**
* key表示分类即: 构建工具 和前端框架
* value是分类下对应的数组
* 可以打印查看效果
*/
// console.log('key', key)
// console.log('value', value)
// 定义字符串,默认内容是分类名称
let items = `<div class="name">${key}</div>`
// 遍历数组
value.forEach(item => {
// 生成每一条内容
// console.log(item.value, item.text)
let lis = `<div value="${item.value}">${item.text}</div>`
// 拼接字符串
items += lis
})
/**
* items <div class="name">构建工具</div><div value="1">Babel</div><div value="2">Webpack</div><div value="3">Rollup</div>
* items <div class="name">前端框架</div><div value="4">Vue</div><div value="5">Angular</div><div value="6">React</div><div value="7">Nerv</div>
*/
console.log('items', items)
// 设置demo盒子的innerHTML的内容
wrap.innerHTML += items
}
}
createElement(classify)
</script>
</body>
</html>