怎么在select里面拼接input呢

怎么在select里面拼接input呢

http://img1.sycdn.imooc.com//climg/5f39dd32094c8a1a10560650.jpg


作业点评了里面老师让我拼接,可 我在option里面写上input是不行的


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
好帮手慕慕子 2020-08-18 09:41:06

同学你好,在获取到外层元素demo后,通过innerHTML属性添加输入框就可以了

http://img1.sycdn.imooc.com//climg/5f3b31a6092083e606920334.jpg

同学可以测试下,祝学习愉快~

好帮手慕慕子 2020-08-18 09:30:57

同学你好,老师需要再跟同学确认下,同学想要的实现的是:通过js动态创建html,实现输入框和列表的拼接,在页面中显示出来是吗?

如果是这样的话,同学可以测试下老师上次回答提供的代码,结合注释理解下。

如果不是的话,建议:同学将你写的完整代码全部粘贴过来,详细描述下具体要实现的功能,老师针对同学的代码进行测试,给出解决方案。

祝学习愉快~

  • 提问者 小杨同学呀 #1
    我就是想知道 怎么在 下拉框里面 放的 input,您内个一串儿代码吧列表全都拼出来了 唯独 没有搜索框 我就要看下拉列表里面的搜索框
    2020-08-18 09:37:07
好帮手慕慕子 2020-08-17 19:17:56

同学你好,作业是没有源码的。因为代码很灵活,实现方式不唯一。我们鼓励大家按照自己的思路去做一做,培养自己的思维能力和编码能力。

老师这里给同学提供一个参考实现的思路:

1、html结构中原生下拉框中添加对应的value和type属性,方便分类。

http://img1.sycdn.imooc.com//climg/5f3a5b670992e75b08390557.jpg

2、获取原生的option元素,然后根据元素的value和type属性以及文本内容,生成数据。

http://img1.sycdn.imooc.com//climg/5f3a63da0993bdc914970751.jpg

3、根据生成的数据动态创建下拉列表,下拉列表内容需要全部显示出来,所以不推荐使用select下拉框实现。直接使用div实现效果即可

http://img1.sycdn.imooc.com//climg/5f3a66e20967be1715000784.jpg

代码运行结果如下:

http://img1.sycdn.imooc.com//climg/5f3b2e7909e81ae508670806.jpg

示例代码如下,同学可以测试理解下

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

祝学习愉快~

  • 提问者 小杨同学呀 #1
    首先很感谢老师谢了这么多 这么耐心。。。可是我问的是 内个下拉框里面的input的怎么实现的。。。您这只是把 下拉列表内容通过js展示出来了...可我想看的是 input啊 怎么下拉出搜索框啊...搜索框 搜索框 搜索框 您能明白? 我不想看 里面的下拉内容 我只想看 下来出来的或者说 怎么实现的在下拉里面放input
    2020-08-18 09:09:34
好帮手慕慕子 2020-08-17 17:53:45

同学你好,建议是如下结构哦。示例:

http://img1.sycdn.imooc.com//climg/5f3a53a409c24c8606570344.jpg

祝学习愉快~

  • 提问者 小杨同学呀 #1
    老师求个源码看看。我这么来回来去提问。问半天也问不到点儿上
    2020-08-17 17:56:28
好帮手慕慕子 2020-08-17 14:42:40

同学你好,不需要在option下在input,可以使用一个div包裹所有的内容,input输入框是一部分,构建工具和前端框架是一部分。

同学可以尝试写一下,修改完作业后,如果还有问题,可以标注上你的问题,再次提交作业,批作业的老师会针对你的完整代码给出详细的修改建议。

祝学习愉快~


  • 提问者 小杨同学呀 #1
    <select name="" id=""> <div> <input type="text"> <option value="">1111</option> <option value="">1122</option> </div> </select> 这种写法吗?
    2020-08-17 14:47:20
  • 我是没有昵称 回复 提问者 小杨同学呀 #2
    用 div 包裹 input 和 select 就行了。你上面的写法,包裹的层次不对。
    2020-08-27 14:11:04
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师