凭空消失的TA

题解

加入第二行代码即可,没有使用elementUI提供的js文件,所以说提供的所有文件都是有用的呀~

 <!-- 引入 element-ui 样式 -->    <link rel="stylesheet" href="./element-ui-2.15.10/index.css" />    <script src="./element-ui-2.15.10/index.js"></script>

用户名片

题解

核心就是让整个卡片无论在什么时候都是页面居中,就是无论你缩放页面总是居中。这里就必须用到最后的center样式

* {  margin: 0;  padding: 0;}html,body {  background: #fceeb5;  height: 100%;  overflow: hidden;}html,body {  background: #fceeb5;}.card {  width: 450px;  height: 250px;  background: #fff;  box-shadow: 0 8px 16px -8px rgba(0, 0, 0, 0.4);  border-radius: 6px;  overflow: hidden;  position: absolute;  margin: auto;  left: 0px;  bottom: 0;  top: 0;  right: 0;}.card h1 {  text-align: center;}.card img {  width: 110px;  height: 110px;  border-radius: 50%;}.additional {  position: absolute;  height: 100%;  background: #92bca6;  z-index: 2;}.user-card {  width: 150px;  height: 100%;  position: relative;  float: left;}.user-card .points {  top: 85%;}.general {  width: 300px;  height: 100%;  position: absolute;  top: 0;  right: 0;  z-index: 1;  box-sizing: border-box;  padding: 12px;  padding-top: 0;  display: flex;  flex-flow: column;  justify-content: space-around;}.more{  display: block;  text-align: right;}/* level 和  points 定位位置 */.level,.points {  width: 72px;  text-align: center;  position: absolute;  color: #fff;  font-size: 12px;  font-weight: bold;  background: rgba(0, 0, 0, 0.15);  padding: 2px 0;  border-radius: 100px;  white-space: nowrap;  /*这里改了一下*/  bottom: 5% !important;}/*  level 位置这里也改了一下 */.level {  top: -68% !important;    height: 15px;}/* TODO 待补充代码 居中样式*/.center{  position: absolute;  left: 0;  right: 0;  top: 0;  bottom: 0;  margin: auto;}

芝麻开门

题解

需要注意的是得把点击确定按钮的事件放在promise中,以至于最终返回的是mPrompt()的状态,不然放在外面返回的就是点击事件的状态了。我就是犯了这个错误,然后答案一直不对。然后点击事件用了.onclick和addEventListener事件监听器,因为开始不太熟悉还是什么都要多用用

const incantations = "芝麻开门";function init(el) {  document.querySelector(".wrapper .btn").addEventListener("click", () => {    mPrompt()      .then((res) => {        console.log("@@@@@@@@@@" + res);        if (res === incantations) {          document            .querySelectorAll("#door .doors")[0]            .classList.add("door-left");          document            .querySelectorAll("#door .doors")[1]            .classList.add("door-right");        }      })      .catch((err) => {        console.log(err);      });  });}/** * @description: 调用函数,开启弹窗,记录输入框的内容,并通过 promise 异步返回输入框中的内容 * @return {Promise} */function mPrompt() {  // 弹窗必须使用以下结构 template 保存的是弹窗的结构字符串,可以先转化为 DOM 再通过 appendChild 方式插入到 body 中  const template = `                                    请输入咒语                                                                                                                                                    `;  // 让对话框弹出,先创建子节点  const dialogDiv = document.createElement("div");  dialogDiv.innerHTML = template;  // body元素最后追加一个div元素  let body = document.querySelector('body');  body.appendChild(dialogDiv);  // 获取对话框的确定和取消按钮,通过这个来操作对话框的显示与隐藏  let confirmBtn = document.getElementById("confirm");  let cancelBtn = document.getElementById("cancel");  let inputVal = "";  // TODO:待补充代码  return new Promise((resolve, reject) => {    // 点击确定事件    confirmBtn.onclick = function () {      // 注意getElementsByTagName获取到的是数组,取第一个      inputVal = document.getElementsByTagName("input")[0].value      body.removeChild(dialogDiv)      if (inputVal == "芝麻开门") {        return resolve("芝麻开门")      } else {        return reject(false)      }    }    // 取消事件    cancelBtn.addEventListener("click", () => {      body.removeChild(dialogDiv)      reject(false)    })  })}

宝贵的一票

总结

这个题还是比较简单的就是考察了简单点dom操作,但是犯了一点错误,就是最终一直没有评测成功,最后发现应该是我动了初始化函数initRender 最初的dom结构,我为了图方便直接在里面都加了那个叉号的dom,但是最后评测时是不能有叉号的dom元素存在的,虽然我使它的display为none了但是还是不能通过检测,提示只有第一次删除检测成功,后面的直到选项小于等于2时应该就失败了。因为它检测到了序列小于2时还存在删除按钮的dom结构。
写这些的目的就是告诉大家一定不要随便操作题目已经给出的dom结构,因为它的评判标准里面就应该会检测最终的dom结构。当然我这个也是有解决办法的,就是在最后判断选项长度小于等于2时直接把选项1和选项2的删除按钮的dom结构remove就ok啦~ 我是小辣鸡一起进步吧

题解

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8" />  <meta http-equiv="X-UA-Compatible" content="IE=edge" />  <title>宝贵的一票</title>  <script src="./js/jquery.min.js"></script>  <link rel="stylesheet" href="./css/bootstrap.min.css" />  <link rel="stylesheet" href="./css/style.css" /></head><body>  <div class="inner-container shadow">    <div class="mb-3 row">      <label class="col-sm-2 col-form-label">投票主题</label>      <div class="col-sm-9">        <input type="text" class="form-control" />      </div>    </div>    <div class="list"></div>    <div class="add">      <div class="addtxt">        <img src="./images/plus-square.svg" alt="加号图标" />        添加选项      </div>    </div>    <div class="form-check checkbox-one">      <input class="form-check-input" type="checkbox" value="" />      <label class="form-check-label" for="flexCheckDefault">        支持多选      </label>    </div>    <div class="form-check">      <input class="form-check-input" type="checkbox" value="" />      <label class="form-check-label" for="flexCheckDefault">        公开投票结果      </label>    </div>    <div class="row bottom">      <div class="col">        <a class="historytxt" href="javascript:void(0)">历史投票</a>      </div>      <div class="col"></div>      <div class="col">        <button type="button" class="btn btn-light">取消</button>        <button type="button" class="btn btn-primary">发起投票</button>      </div>    </div>  </div>  <script>    let initRender = (txt) => {      return `                ${txt}                                                                                                                           `;    };    $(      (function () {        // 初始化的时候渲染两条数据,且不带删除符号        for (let index = 0; index < 2; index++) {          let initList = initRender(`选项${index + 1}`);          $(".list").append(initList);        }        // 点击加号逻辑        $(".add").click(function () {          // TODO 待补充代码          // 获取当前选项列表的长度,根据initRender函数中的模板字符串可得到灵感                    let listLength = $('.list .row').length;          let initList = initRender(`选项${listLength + 1}`);          $(".list").append(initList);          console.log(listLength);          if (listLength >= 2) {            $('.del-icon').css("display", "block")          }        });        // 点击 x 删除逻辑,列表小于 2 项时不显示删除图标        $(document).on("click", ".del-icon", function () {          // TODO 待补充代码          // console.log($(this).parent().parent());等价于$(this).parents()[1]          $(this).parents()[1].remove()                          let listLength = $('.list .row').length;          for (let index = 0; index < listLength; index++) {            $('.txt')[index].innerHTML=`选项${index+1}`          }           console.log(listLength);          if (listLength> 2) {            $('.del-icon').css("display", "block")          }else{            $('.del-icon').css("display", "none")            // 切记要删除这里呀,因为判题应该是根据dom结构来滴            $('.list .col-sm-1').remove()          }        });      })()    );  </script></body></html>

粒粒皆辛苦

思路:

  • 先直接看json文件中的数据格式,看到是一个对象中嵌套对象的格式。获取数据就好
  • 一般echarts题都有初始化渲染的例子,我们不要动,然后直接看它是怎么渲染的,照着写就行。
    获取到数据后对数据进行处理,我是直接使用for of 对对象进行遍历然后将里面不同类型的值进行分类
  • 直接修改 option.dataset.source中的值注意最前面要加上大豆,玉米啥的中文名。最后一定得调用渲染函数myChart.setOption(option);最终页面才会改变

题解

<!DOCTYPE html><html style="height: 100%"><head>  <meta charset="utf-8" />  <meta http-equiv="X-UA-Compatible" content="IE=edge" />  <title>粒粒皆辛苦</title>  <script type="text/javascript" src="./js/echarts.min.js"></script>  <script src="./js/axios.min.js"></script></head><body style="height: 100%; margin: 0; overflow: hidden">  <div id="container" style="height: 80%; width: 80%; margin: 5% auto"></div>  <script>    var dom = document.getElementById("container");    var option;    var myChart = echarts.init(dom, null, {      renderer: "canvas",      useDirtyRect: false,    });    let initCharts = () => {      option = {        title: {          text: "近五年 x 市粮食总产量分布以及 2022 年粮食产量比例",          subtext: "单位(万吨)",        },        dataset: {          //source -> 图表显示所需的数据格式(饼形图和折线图共用),请勿手动修改此行          source: [            ["全部", "2017", "2018", "2019", "2020", "2021", "2022"],            ["小麦", 1, 1, 1, 1, 1, 1],            ["大豆", 9, 9, 9, 9, 9, 9],            ["马铃薯", 13, 13, 13, 13, 13, 13],            ["玉米", 23, 23, 23, 23, 23, 23],          ],        },        xAxis: { type: "category" },        yAxis: { gridIndex: 0 },        grid: { top: "55%" },        series: [          {            type: "line",            seriesLayoutBy: "row",          },          {            type: "line",            seriesLayoutBy: "row",          },          {            type: "line",            seriesLayoutBy: "row",          },          {            type: "line",            seriesLayoutBy: "row",          },          {            type: "pie",            id: "pie",            radius: "30%",            center: ["50%", "25%"],            label: {              // 2022 数据的百分比              formatter: "{b} {@2022} ({d}%)",            },            encode: {              itemName: "全部",              value: "2022",              tooltip: "2022",            },          },        ],      };      if (option && typeof option === "object") {        // myChart.setOption -> 设置 echarts 数据的方法        myChart.setOption(option);      }      window.addEventListener("resize", myChart.resize);    };    initCharts();    // TODO: 待补充代码    var dataList = {}    // 初始化四个数组    var wheat = ["小麦"], soybean = ["大豆"], corn = ["玉米"], potato = ["马铃薯"]    window.onload = function () {      axios.get(' ./data.json')        .then(res => {          dataList = res.data.data;          // 双重循环取对象值          for (item in dataList) {            //  console.log(dataList[item]);            let value = dataList[item]            for (subitem in value) {              // console.log(value[subitem]);              if (subitem === "wheat") {                wheat.push(value[subitem])              } else if (subitem === "soybean") {                soybean.push(value[subitem])              } else if (subitem === "corn") {                corn.push(value[subitem])              } else if (subitem === "potato") {                potato.push(value[subitem])              }            }          }          option.dataset.source = [            ["全部", "2017", "2018", "2019", "2020", "2021", "2022"],            wheat,            soybean,            potato,            corn,]                    myChart.setOption(option);          console.log(option);        })    }  </script></body></html>

618 活动

介绍

最近蓝桥准备了很多 618 优惠,今天我们将化身蓝桥前端小工,亲自动手制作一个 618 活动页面,快来一显身手吧。

后面补哈~~

资讯接口

题解

其实和模拟一的那个node题都是一样的原理

const http=require('http');const server=http.createServer();server.on('request',(req,res)=>{    // 设置请求头    res.setHeader("Content-type", "text/html;charset=utf8");  if(req.url=="/news"){    res.end(JSON.stringify(        [            {              "channelId": "5572a108b3cdc86cf39001cd",              "name": "国内焦点"            },            {              "channelId": "5572a108b3cdc86cf39001ce",              "name": "国际焦点"            }          ]    ))  }else{    res.end("404")  }})server.listen(8080,function(){    console.log("8080端口启动成功");})

绝美宋词

题解

思路:使用v-model实现双向绑定,最后使用watch监听words的变化,最后需要使用v-html指令在展示经过我们处理的字符串

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8" />  <title>绝美宋词</title>  <link rel="stylesheet" href="css/style.css" />  <script src="./js/vue.min.js"></script>  <script src="./js/axios.min.js"></script></head><body>  <div id="app">    <h1 style="text-align: center">输入关键字,找一首词</h1>    <!-- TODO:待补充代码 -->    <div class="search-form">      <input type="text" id="search" v-model="words" class="search" placeholder="词牌名 词句 词人" />      <ul class="suggestions" v-if="">        <li v-for="item in resultList" :key="item.title">          <span class="poet" v-html="item.poetry_content"></span>          <span class="title" v-html=`${item.title}-${item.author}`></span>        </li>      </ul>    </div>  </div>  <script>    let vm = new Vue({      el: '#app',      // TODO:待补充代码      data() {        return ({          poetryList: [],//数据库数据          resultList: [],//最终展示数据          words: '' //关键字        })      },      mounted() {        axios.get('./data.json').then(res => {          this.poetryList = res.data        })      },      watch: {        words(newVal, oldVal) {          if (newVal === '') {            //如果关键字为空不匹配,直接返回            this.resultList = [];            return;          }          console.log("newVal值", newVal);          this.resultList = [];          this.poetryList.forEach(item => {            // 处理关键字,得到含有关键字的对象            if (item.poetry_content.includes(newVal) || item.title.includes(newVal) || item.author.includes(newVal)) {              // 注意这里得使用深拷贝,不然在下面重新赋值resultList时会改变原有的从JSON中的数据,              // 导致最终只能匹配一个字符              this.resultList.push(JSON.parse(JSON.stringify(item)))            }          })          // 处理高亮,全部的          let reg = new RegExp(newVal, 'g');          this.resultList.forEach(ele => {            // 关键字替换            ele.poetry_content = ele.poetry_content.replace(reg, `${newVal}`)            ele.title = ele.title.replace(reg, `${newVal}`)            ele.author = ele.author.replace(reg, `${newVal}`);          })        },      }    })  </script></body></html>

平地起高楼

题解

这个题最开始我是想直接一遍又一片for循环的后来发现好像所有的流程都是一样的,就开始尝试使用递归,但是最开始的递归时所有的数据都是单独存在的,并没有什么联系,于是我就打开了控制台反复测试每一次递归的结果,发现的确每一次递归都是正确的,但是我设置的resultList.children=convertToTree(regions, item.id)并没有效果,导致所有的数据都无法关联,最后测试出了可以直接使用item.children,因为regions的数据是我们每一次递归都不会改变的,所以可以对其进行操作,保证最后的递归数据能够串联起来。

function convertToTree(regions, rootId = "0") {  // TODO: 在这里写入具体的实现逻辑  // 将平铺的结构转化为树状结构,并将 rootId 下的所有子节点数组返回  // 如果不存在 rootId 下的子节点,则返回一个空数组    let resultList=[];  // let testList=[]  regions.forEach(item=>{    // let testList=[];    if(item.pid===rootId){      // 符合结果就放进去,比如最先找到四川,然后就把四川      //放进去,之后在把四川作为pid去查找下一个子代。之后在遍历子代      resultList.push(item);      // testList=resultList      // 没用,因为每一次递归后的return的是resultList,所以最终会不断      //的改变,所以得使用item.children,直接改变它的值      //resultList.children=convertToTree(regions, item.id)      // 为孩子做准备,题目也说了如果没有孩子就设置为空数组,不影响      // item.children=[],这一次递归的结果就是找到这一轮符合要求的子代      //这里把item.id作为pid继续查找子代      item.children=convertToTree(regions, item.id)      // console.log(convertToTree(regions, item.id));      // resultList.children=convertToTree(regions, item.id);             // console.log(resultList);解开注释,观察递归效果    }  })  return resultList;}module.exports = convertToTree; // 检测需要,请勿删除

收快递了

最初错误示例

function findRegion(regions, regionName) {  // TODO: 在这里写入具体的实现逻辑  // 需要从树状结构的行政信息中,遍历找到目标区域的行政信息,如输入:成都市,返回 [四川省,成都市]  // 如果所输入的位置信息不存在,则返回 null  let replceList=regions[0];  // 省  let resultArr=[regions[0].name];  if(replceList.name===regionName){        return resultArr;  }  var flag1=false;  for(let i=0;i<replceList.children.length;i++){    // 市级    if(replceList.children[i].name===regionName){      resultArr.push(regionName)      flag1=true      break;    }else{      // 区级     replceList.children[i].children.forEach(item=>{        if(item.name===regionName){          flag1=true          resultArr.push(replceList.children[i].name)            resultArr.push(item.name)        }     })          }  }  if(flag1){    return resultArr;  }else{    return null;  }}module.exports = findRegion; // 检测需要,请勿删除

题解

检测发现原来是我最初的时候就把省份定死啦,我以为最后测试的数据只有一个省原来不是!!!所以在加一层循环就好啦!!!但是这样真的很消耗时间哦,幸好不是算法竞赛,不然就给我TTL了,真给我写麻了。
需要注意的是只有for循环或者while等其他循环语句才可以使用break,所以当我使用forEach时是没有使用break跳出的。

function findRegion(regions, regionName) {  // TODO: 在这里写入具体的实现逻辑  // 需要从树状结构的行政信息中,遍历找到目标区域的行政信息,如输入:成都市,返回 [四川省,成都市]  // 如果所输入的位置信息不存在,则返回 nulllet resultArr=[]  var flag1 = false;//最终返回条件  for (let t = 0; t < regions.length; t++) {    // 省    if (regions[t].name === regionName) {      resultArr.push(regions[t].name)      flag1 = true;      break    } else {      for (let i = 0; i < regions[t].children.length; i++) {        // 市级        if (regions[t].children[i].name === regionName) {          resultArr.push(regions[t].name)          resultArr.push(regionName)          flag1 = true          break;        } else {          // 区级          regions[t].children[i].children.forEach(item => {            if (item.name === regionName) {              flag1 = true              resultArr.push(regions[t].name)              resultArr.push(regions[t].children[i].name)              resultArr.push(item.name)            }                     })        }      }    }  }  if (flag1) {    return resultArr;  } else {    return null;  }}module.exports = findRegion; // 检测需要,请勿删除