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 相关文章推荐
JavaScript使用过程中需要注意的地方和一些基本语法
Aug 26 Javascript
30分钟就入门的正则表达式基础教程
Feb 25 Javascript
js关闭当前页面(窗口)的几种方式总结
Mar 05 Javascript
node在两个div之间移动,用ztree实现
Mar 06 Javascript
解析jQuery与其它js(Prototype)库兼容共存
Jul 04 Javascript
深入理解JS中的变量及作用域、undefined与null
Mar 04 Javascript
jQuery实现购物车多物品数量的加减+总价计算
Jun 06 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
bootstrap模态框远程示例代码分享
May 22 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
Jun 24 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 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
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
php批量上传的实现代码
2013/06/09 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
javascript每日必学之运算符
2016/02/16 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python中的is和id用法分析
2015/01/26 Python
Python去除列表中重复元素的方法
2015/03/20 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
python实现括号匹配的思路详解
2018/08/23 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
python离线安装外部依赖包的实现
2020/02/13 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Python类型转换的魔术方法详解
2020/12/23 Python
生物制药自我鉴定
2014/01/25 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server