蓝桥杯18582-真人鉴定器

蓝桥杯18582-真人鉴定器

介绍

真人鉴定功能是一种常见的网络安全措施,用于保护网站免受机器人或自动化程序的恶意攻击。该功能基于人类视觉能力,要求用户在访问网站时通过切换右边轮播图,识别与左边要求的图片个数相符的图片,并点击"提交"按钮进行验证。

准备

开始答题前,需要先打开本题的项目代码文件夹,目录结构如下:

txt 复制代码
├── css
├── images
├── effect.gif
├── index.html
└── js
    └── index.js

其中:

  • css 是样式文件夹。
  • images 是图片文件夹。
  • effect.gif 是最终效果图。
  • index.html 是主页面。
  • js/index.js 是待补充的代码 js 文件。

在浏览器中预览 index.html 页面效果如下:

目标

本题需修复验证码功能,使用户可以正常切换右边轮播图。找到 js/index.js 文件中的 changeBanner 函数,完善其中的 TODO 部分,目标如下:

该函数接收一个参数 isPre(布尔值)区分当前点击的按钮。点击上一页/下一页时修改全局变量 thisIndex(即图片的索引)正确显示对应的图片,共四张图片。

  1. 点击 "←"(id=pre)按钮时,isPretrue,轮播图切换到上一页。若当前轮播图为第一页,则切换到最后一页(即第四页)。
  2. 点击 "→"(id=next)按钮时,isPrefalse,轮播图切换到下一页。若当前轮播图为最后一页(即第四页),则切换到第一页。

解题

vue 复制代码
index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>真人鉴定器</title>
    <link rel="stylesheet" href="./css/style.css">
  </head>
  <body>
    <div class="main">
      <p class="error">验证失败,请在右侧更换后重新提交!</p>
      <h2>使用箭头来更换物体的数量,使其与左图相同。</h2>
      <div class="content">
        <div class="left">
          <span id="num">2</span>
          <span>X</span>
          <img id="leftStar" src="./images/flower.svg" alt="" srcset="">
        </div>
        <div class="right">
          <div class="banner">
            <ul class="imgList">
              <li>
                <img src="./images/flower.svg" alt="">
                <img src="./images/flower.svg" alt="">
                <img src="./images/flower.svg" alt="">
              </li>
              <li>
                <img src="./images/flower.svg" alt="">
              </li>
              <li>
                <img src="./images/flower.svg" alt="">
                <img src="./images/flower.svg" alt="">
              </li>
              <li>
                <img src="./images/flower.svg" alt="">
                <img src="./images/flower.svg" alt="">
                <img src="./images/flower.svg" alt="">
                <img src="./images/flower.svg" alt="">
              </li>
            </ul>
            <div class="circle"></div>
            <div class="toolbar">
              <div id="pre"><img src="./images/left_arrow.svg" alt=""></div>
              <div id="next"><img src="./images/right_arrow.svg" alt=""></div>
            </div>
          </div>
        </div>
      </div>
      <button class="btn">提交</button>
    </div>
  </body>
  <script src="./js/index.js"></script>
</html>
javascript 复制代码
//inedx.js
window.onload = function () {
  var imgList = document.querySelector(".imgList");
  var circle = document.querySelector(".circle");
  var thisIndex = 0;
  var imgListLi = imgList.children;
  var circleA = circle.children;
  var flag = true;
  imgList.style.width = imgList.children.length * 300 + "px";
  /**
   * 轮播图切换
   * @param {*} isPre 是否上一页:true 上一页,false 下一页。
   */
  function changeBanner(isPre) {
    // TODO:待补充代码
   	if(isPre==true)
    	thisIndex!=0?thisIndex--:thisIndex=3;
    }
    if(isPre==false){
    	thisIndex!=3?thisIndex++:thisIndex=0;
    }
    // TODO: END
    if (flag) {
      flag = false;
      slow(imgList, -thisIndex * 300, function () {
        flag = true;
      });
      circleChange();
    }
  }

  for (var i = 0; i < imgList.children.length; i++) {
    var aNode = document.createElement("a");
    aNode.setAttribute("index", i); //设置自定义属性
    if (i == 0) {
      aNode.className = "hover";
    }
    circle.appendChild(aNode);
  }
  circle.addEventListener("click", function (e) {
    if (flag) {
      flag = false;
      if (e.target.nodeName != "A") {
        return false;
      }
      thisIndex = e.target.getAttribute("index");
      slow(imgList, -thisIndex * 300, function () {
        flag = true;
      });
      circleChange();
    }
  });
  document.querySelector("#pre").addEventListener("click", function () {
    changeBanner(true);
  });
  document.querySelector("#next").addEventListener("click", function () {
    changeBanner(false);
  });
  
  setImgStyle();
  document.querySelector(".btn").addEventListener("click", function () {
    const num = parseInt(document.querySelector("#num").innerText);
    if (imgListLi[thisIndex].children.length == num) {
      document.querySelector(".main").innerHTML = `<div class="success">
        <img src="./images/success.svg" alt="">
        <h2>验证完成!</h2>
        <p>您已经证明您是人类。请继续操作。</p>
      </div>`;
    } else {
      document.querySelector(".error").style = "opacity: 1;";
    }
  });

  // 设置图片的样式
  function setImgStyle() {
    var numEl = document.querySelector("#num");
    var fontSize = Math.floor(Math.random() * 10 + 20);
    var numElAngle = Math.floor(Math.random() * 60 - 30);
    numEl.style = `font-size:${fontSize}px;
          transform: rotate(${numElAngle}deg);
          -moz-transform: rotate(${numElAngle}deg);
          -webkit-transform: rotate(${numElAngle}deg);
          -o-transform: rotate(${numElAngle}deg)`;

    var photo = document.querySelectorAll(".imgList img");
    for (var i = 0; i < photo.length; i++) {
      var width = Math.floor(Math.random() * 100 + 40);
      var left = Math.floor(Math.random() * 760 + 40);
      var top = Math.floor(Math.random() * 400);
      var angle = Math.floor(Math.random() * 60 - 30);
      let s = `left:${left}px;
          width:${width}px;
          top :${top}px;
          transform: rotate(${angle}deg);
          -moz-transform: rotate(${angle}deg);
          -webkit-transform: rotate(${angle}deg);
          -o-transform: rotate(${angle}deg)`;
      photo[i].style = s;
    }
  }

  /**
   * 分页器样式切换
   */
  function circleChange() {
    for (var i = 0; i < circleA.length; i++) {
      circleA[i].className = "";
    }
    circleA[thisIndex].className = "hover";
  }
  /**
   * 轮播图位置移动
   * @param {*} obj 
   * @param {*} target 
   * @param {*} callback 
   */
  function slow(obj, target, callback) {
    obj.myInter = setInterval(function () {
      var offsetLeft = obj.offsetLeft;
      var num = (target - offsetLeft) / 10;
      num > 0 ? (num = Math.ceil(num)) : (num = Math.floor(num));
      if (offsetLeft == target) {
        clearInterval(obj.myInter);
        callback && callback();
      } else {
        obj.style.left = offsetLeft + num + "px";
      }
    }, 10);
  }
};
相关推荐
竹下为生1 小时前
LeetCode --- 448 周赛
算法·leetcode·职场和发展
CQY05312 小时前
蓝桥杯2025年第十六届省赛真题-水质检测
职场和发展·蓝桥杯
Star Curry2 小时前
【读书笔记】《编码:隐匿在计算机软硬件背后的语言》01 逻辑与开关
stm32·单片机·嵌入式硬件·职场和发展·51单片机·学习方法
S01d13r4 小时前
LeetCode 解题思路 47(最长回文子串、最长公共子序列)
算法·leetcode·职场和发展
YuforiaCode5 小时前
第十一届蓝桥杯 2020 C/C++组 蛇形填数
c语言·c++·蓝桥杯
枫夜求索阁8 小时前
大模型文件类型揭秘:从基础到面试挑战
人工智能·面试·职场和发展·大模型
俺不是西瓜太郎´•ﻌ•`10 小时前
二维差分数组(JAVA)蓝桥杯
java·开发语言·蓝桥杯
hh妙蛙种子10 小时前
牛客练习赛138
c++·经验分享·算法·leetcode·职场和发展·深度优先·图论
玩转数据库管理工具FOR DBLENS15 小时前
项目高压生存指南:科学重构身体与认知系统的抗压算法
大数据·数据库·职场和发展·项目管理
WAR|CRANE16 小时前
操作系统面试问题(4)
面试·职场和发展