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
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>
|