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