JS制作图形验证码实现代码


Posted in Javascript onOctober 19, 2020

第一步我们来到要展示验证码的页面,当我们按下营业执照的时候让其,弹出一个弹框,弹框的上面就是验证码,如图一所示:

JS制作图形验证码实现代码

(图一)

弹框的样式如图二所示:

JS制作图形验证码实现代码

(图二)

我们要对验证码的值进行校验,判断验证码是否输入正确,当输入不正确的时候,我们提示错误信息,提示信息如图三所示:

JS制作图形验证码实现代码

(图三)

如果页面了验证正确,这不会提示错误信息并且调到我们的目标页面,如图四所示:

JS制作图形验证码实现代码

(图四)

路由层描述

/**
  供货商店铺-店铺简介
  */
  //1-在路由层进行设置,页面跳转到根目录下/buyer/vshop/info.ejs页面进行跳转,然后在回调函数中进行接口的调用
  router.get('/buyer/vshop/info', function(req, res, next) { 
  //2-调用接口获取数据 
  async.parallel({ 
  verifycode :function(fn){
  //3-调用接口获取本机的IP地址
   var args= {
   userIp: tools.getClientIp(req)
   };

   //4-调用接口verifyCodeHelper的createVcode方法获取captcha与 csnonce的数据,他们的值都是腾讯接口verifyCodeHelper返回的数据

   verifyCodeHelper.createVcode(args, function(err, result){
   if (err) {
    console.log(err);
   }
   else{
    fn(null, {
    captcha: result.data.queryUrl,
    csnonce: result.csnonce || 0
    })
   }
   });
  }
  },function(err, result){
  if (err) {
   res.end(err);
  }else{
   result.getDetail= res.shopInfo;
   var fxzStatus = res.fxzStatus || {};

  //5-进行根目录下buyer/vshop/describe页面的渲染,传递相关参数到EJS页面

   res.render("buyer/vshop/describe", { 
   title: srcBizType==1 ? result.getDetail.name : "店铺简介",
   pageName:"vshopInfo",
   captcha:result.verifycode.captcha,//验证码
   isTencent: 1,
   csnonce:result.verifycode.csnonce
   });
  }
  });
 });

EJS层描述

<%- include ../../header %>
 //1-获取路由传递的 csnonce
 <script>
 APP.newLogin= {
  csnonce: '<%- csnonce %>',
 };
 <link href="/css/vshop/describe.css?v=<%= config.version %>" rel="stylesheet" />
 <style id="dynamic"></style>
 <div class="arrow_mask"></div>
 <div class="arrow">
 <div>
  <img src="/imgs/vshop/verification-code-back.png" class="verification-code-back" />
 </div>
 <ul class="arrow-mess"> <span class="sku-close" id="btn_sku_dialog_close"> </span>
  <li>请输入下面的图形验证码</li>
  <li>
   <img id="J_BtnVerifyPicCodeTencent" src="" class="captcha" style="height:30px;margin:0 15px;" />
  </li>
  <li>
  <div class="btn_mes">
   <input class="btn_mes_text" type="text" maxlength="6">
  </div>
  </li>
 </ul>
 <div class="btn_mes2">
  <input type="button" class="license-submit" value="提交">
 </div>
 </div>
 <div data-role="container" class="body <%= pageName %>">
 <header data-role="header">
  <%- include ./widget_vshop %>
 </header>
 <section data-role="body" class="section-body">
  <div class="div-section div-section-info">
  <ul class="info1">
   <li class="gap"><div class="left">所在地</div><div class="right"><%- detail.address%></div></li>
   <li><div class="left">开店时间</div><div class="right"><%- detail.createTime%></div></li>
  </ul>
  <ul class="info2">
   <li class="gap"><div class="left">发货速度</div><div class="right"><%- detail.score.express%></div></li>
   <li class="gap"><div class="left">服务态度</div><div class="right"><%- detail.score.service%></div></li>
   <li><div class="left">描述相符</div><div class="right"><%- detail.score.describe%></div></li>
  </ul>
  <ul class="info3">
   <%if(detail.shopTypeIndex==1||detail.shopTypeIndex==2||detail.shopTypeIndex==3){var bg = '/imgs/vshop/tip.png',color='#39dda5' }else{var bg = '/imgs/vshop/tip3.png',color='#59aaff'}%>
   <li><div class="left anotherC">认证</div><div class="right textR"><span style="background: url(<%-bg%>) left 1px no-repeat;background-size: 14px 12px;"><i style="background: <%-color%>"><%- detail.shopType %></i></span></div></li>
  </ul>
  <ul class="info4">
   <li><a href="tel:<%- detail.phone%>" class="tel">服务电话</a></li>
   <li><a data-aid="<%- aid%>" class="webim">在线客服</a></li>
   <li class="business-license">
   <!--<a href="/buyer/vshop/license?aid=<%- aid%>">-->
   <a href="#">
    <span >营业执照</span>
    <label>查看<span></span></label>
   </a>

   </li>
  </ul>
  </div>
  <%- include ./footer %>
  <div id="vue_hooker">
  <child-nav></child-nav>
  <%- include ../../widget_navBtns %>
  </div> 
 </section>
 </div>
 //2-获取路由传递的captcha
 <script type="text/javascript" src="<%= captcha %>"></script>
 //3-引入相关JS文件
 <script>
 seajs.use("js_cmd/vshop/home-cmd");
 </script>
 <%- include ../../footer %>

JS层描述

/**
 这是一个公用文件,vshop首页&vshop全部商品共用
 */
 //1-引入页面所需的各个模块
 define(function (require, exports, module) {
 var $ = require("./top-suction-cmd"),
  myDialog = require("lib_cmd/myDialog-cmd"),
  main = require("js_cmd/main-cmd"),
  DataLoader = require("./tool-cmd"),
  fxzTool = require("./fxzTool-cmd"),
  Vue = require("lib_cmd/vue-cmd"),
  widget_navBtns = require("js_cmd/navBtns-cmd"),
  $eles = {},
  eles = {};

 //2-Vue实例化 
 var vm = new Vue({
  data: {},
  methods: {}
 });

 //3- 页面初始化函数

 function initPage() {
  vm.$mount('#vue_hooker');
  window.scroll(0,0);
 }
 //4- 验证码相关处理函数
 function license(){
  $('.info4 .business-license').click(function (ev) { //弹层
  $('.btn_mes_text').val("");
  $('.arrow_mask').show();
  $('.arrow').show();
  $('#nav_omit').remove();
  });
  $('#btn_sku_dialog_close').click(function(ev){//弹窗
  $('.arrow_mask').hide();
  $('.arrow').hide();
  $('.btn_mes_text').val("");
  });

  $('.btn_mes_text').focus(function(){ //输入框获得焦点
  $('.btn_mes_text').val("");
  if($('.verification-code').length!=0){
   $('.verification-code').remove();
  }
  });
  $('.license-submit').click(function(){
  APP.verifyPicCode();
  });

 }

 //5- 验证码初始化函数() TSOCapObj是腾讯接口里面的方法

 function verify_initPage(){
  $('#J_BtnVerifyPicCodeTencent').on('click', function () {
  TSOCapObj.refresh();
  });
  //初始化,参数传入显示验证码的元素imgid
  TSOCapObj.init("J_BtnVerifyPicCodeTencent");
  //刷新拉取验证码图片
  TSOCapObj.refresh();

  APP.verifyPicCode= function(fn) {
  //获取用户输入
  var ans = $(".btn_mes_text").val();
  //验证答案,验证完成后会回调第二个参数传入的函数
  TSOCapObj.verify(ans , function(ret_json){
   if (ret_json.errorCode!=0) {
   $(".btn_mes_text").val("");
   TSOCapObj.refresh();
   //tip("图形验证码输入错误!");
   if($('.verification-code').length==0){
    $('.btn_mes').eq(0).append(" <div class='verification-code'>请输入正确的验证码</div>");
   }
   $('.btn_mes_text').blur(function(){
    $('.btn_mes_text').text("");
   });
   } else {
   window.location="/buyer/vshop/license?aid=" + APP.aid;
   fn(ret_json.ticket);
   }
  });
  }
 }

  //6- 页面初始化函数的执行
 $(function () {
  initPage();
  license();
  verify_initPage();
 });

 });

CCS层描述

@import url(common.css);

 .div-section-info .info4{padding: 0}
 .div-section-info .info4 li{
 padding: 11px 14px;
 line-height: 20px;
 border-bottom: 1px solid #e6e6e6;

 }
 .div-section-info .info4 li a{
 color: #333;

 display: block;
 }
 .div-section-info .info4 li a.tel{
 background: url(/imgs/vshop/callAndMsg.png) no-repeat; 
 background-size: 20px 60px;
  background-position: right 0;
 }
 .div-section-info .info4 li a.webim{
 background: url(/imgs/vshop/callAndMsg.png) no-repeat; 
 background-size: 20px 60px;
 background-position: right -30px;
 }
 .div-section-info .info4 li a label{ 
 display: block;
 float: right;
 }

 .div-section-info .info4 li a label span{ 
 display: block;
 width: 12px;
 height: 12px;
 border-right:1px solid #666;
 border-bottom:1px solid #666;
 -webkit-transform:rotate(-45deg);
 float: right;
 margin-top: 4px;

 }
 .arrow_mask {
 position: fixed;
 top: 0;
 left: 0;
 bottom: 0;
 right: 0;
 z-index: 101;
 display: none;
 background: black;
 opacity: 0.7;
 }
 .arrow{
 width: 250px;
 height: 226px;
 background-color: #FFFFFF;
 position: fixed;
 top: 50%;
 left: 50%;
 z-index: 102;
 -webkit-transform: translate(-50%, -50%);
 -moz-transform: translate(-50%, -50%);
 -ms-transform: translate(-50%, -50%);
 -o-transform: translate(-50%, -50%);
 transform: translate(-50%, -50%);
 border-radius: 10px;
 display: none;
 }
 .arrow-mess li:nth-of-type(1){
 text-align: center;
 margin-bottom: 8px;
 font-size: 14px;
 color: #333333;
 }
 .arrow-mess li:nth-of-type(2){
 text-align: center;
 margin-bottom: 10px;
 }
 .arrow-mess li:nth-of-type(3) input{
 width: 100%;
 height: 30px;
 border: 1px solid #979797;
 text-align: center;
 border-radius: 3px;
 font-family: PingFangSC-Regular;
 font-size: 16px;
 color: #333333;
 letter-spacing: 0px;
 }
 .btn_mes{
 margin-bottom: 15px;
 width: 100%;
 padding-left: 48px;
 padding-right: 48px;
 position: relative;
 }
 .btn_mes2{
 width: 100%;
 padding-left: 70px;
 padding-right: 70px;
 /* position: relative; */
 position: absolute;
 bottom: 0px;
 margin-bottom: 10px;
 }

 .license-submit{
 width: 100%;
 height: 44px;
 background: #FF534C;
 border: 1px solid #FF534C;
 font-size: 14px;
 border-radius: 4px;
 color: #FFFFFF;
 }

 .sku-close {
 background: url(/imgs/vshop/verification-code-del.png) no-repeat right;
 -webkit-background-size: 25px auto;
 display: inline-block;
 width: 26px;
 height: 26px;
 position: absolute;
 right: 0px;
 top: 0px;
 margin-right: -13px;
 margin-top: -13px;
 }
 .verification-code{
 z-index: 102;
 color: #FFAA00;
 position: absolute;
 font-size: 12px;
 top: 4px;
 }
 .verification-code-back{
 width: 100%;
 position: absolute;
 height: 46px;
 }
 .arrow div:nth-of-type(1){
 position: relative;
 }
 .arrow-mess{
 margin-top: 52px;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
Oct 17 Javascript
JavaScript Perfection kill 测试及答案
Mar 23 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
JavaScript开发者必备的10个Sublime Text插件
Feb 27 Javascript
jQuery Validate插件实现表单验证
Aug 19 Javascript
jQuery表格(Table)基本操作实例分析
Mar 10 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
Nov 08 jQuery
web前端vue实现插值文本和输出原始html
Jan 19 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
Sep 14 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
Nov 17 Javascript
详解Typescript 内置的模块导入兼容方式
May 31 Javascript
JS防止网页被嵌入iframe框架的方法分析
Sep 13 #Javascript
javascript数组遍历的方法实例分析
Sep 13 #Javascript
jQuery弹出遮罩层效果完整示例
Sep 13 #Javascript
JS简单去除数组中重复项的方法
Sep 13 #Javascript
jQuery包裹节点用法完整示例
Sep 13 #Javascript
jQuery查找节点方法完整实例
Sep 13 #Javascript
jQuery表单对象属性过滤选择器实例详解
Sep 13 #Javascript
You might like
在线短消息收发的程序,不用数据库
2006/10/09 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
微信小程序Redux绑定实例详解
2017/06/07 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
2020/03/17 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
python中sleep函数用法实例分析
2015/04/29 Python
python中的decorator的作用详解
2018/07/26 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
EJB发布WEB服务一般步骤
2012/10/31 面试题
教师实习期自我鉴定
2013/10/06 职场文书
学习党章思想汇报
2014/01/07 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
团队经理竞聘书
2014/03/31 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
给上级领导的感谢信
2015/01/22 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript