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 相关文章推荐
jQuery getJSON()+.ashx 实现分页(改进版)
Mar 28 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
让html页面不缓存js的实现方法
Oct 31 Javascript
js实现的后台左侧管理菜单代码
Sep 11 Javascript
Javascript的表单验证-提交表单
Mar 18 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
Jul 22 Javascript
浅析vue component 组件使用
Mar 06 Javascript
浅谈vue中数据双向绑定的实现原理
Sep 14 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
Nov 20 Javascript
Bootstrap模态对话框中显示动态内容的方法
Aug 10 Javascript
webpack4 入门最简单的例子介绍
Sep 05 Javascript
JavaScript中的this基本问题实例小结
Mar 09 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
PHP 日常开发小技巧
2009/09/23 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python解析文件示例
2014/01/23 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
教育英语专业毕业生的求职信
2014/03/13 职场文书
同学会主持词
2014/03/18 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
摘录式读书笔记
2015/07/01 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
56句经典英文座右铭
2019/08/09 职场文书
java实现面板之间切换功能
2022/06/10 Java/Android