jQuery实现发送验证码30s倒计时,且刷新页面时有效
在这里讲一讲这个案例的实现思路吧(个人见解)。。核心思想:为防止页面刷新时倒计时失效的解决方案是:当每次刷新一次页面时都执行一个函数 即下面讲到的 setStyle() 函数。这个函数会根据当前的 cookie 值判断 是否处于倒计时阶段 ,因为 cookie 值不会随着 网页的刷新而改变。
最后面已附上全部代码可直接复制下来借鉴一下。
1、本案例用到了 jQuery,第一步:页面引入 jQuery。
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
2、第二步:HTML 部分,为演示方便 只需一个按钮即可。
<button id="btn">获取</button>
3、第三步:js 代码部分。该部分 是采用操作 cookie 来实现 刷新页面 倒计时不失效。
①点击按钮设置 cookie 、显示倒计时时间以及禁用按钮
$('#btn').click(function(){
$('#btn').text('倒计时30s'); // 倒计时
$('#btn').prop('disabled',true); //禁用按钮
$(document)[0].cookie = 'ckey='+30; // 设置 cokie
});
②获取当前 cookie 值
function getCookie(){
// 获取全部的 cookie
var cookie = $(document)[0].cookie;
// 获取 cookie 项 (数组)
var citem = cookie.split(';');
// 过滤数组 获得 键为 ckey 的项
var ckey = citem.filter(function(item){
return item.split('=')[0].trim()=='ckey';
});
// 获得 时间 cval
cval = ckey[0].split('=')[1];
return cval;
}
③防止页面刷新时倒计时失效。解决方案是 每刷新一次页面都要获取当前的 cookie 值 ,如果值不为零的话一直是禁用状态
function setStyle(){
var cval = getCookie();
if(cval>1){
$('#btn').text('倒计时'+cval+'s');
$('#btn').prop('disabled',true);
console.log('hahah')
}else{
$('#btn').text('获取验证码');
$('#btn').prop('disabled',false);
}
}
setStyle();
④定时器实现倒计时
setInterval(function(){
setCookie();
console.log(1);
},1000)
function setCookie(){
var cval = getCookie();
if(cval>1){
$(document)[0].cookie = 'ckey='+(cval-1);
$('#btn').text('倒计时'+(cval-1)+'s');
$('#btn').prop('disabled',true);
}else if(cval==1){
$('#btn').text('获取验证码');
$('#btn').prop('disabled',false);
$(document)[0].cookie = 'ckey='+0;
}
}
4、完整代码 直接复制 即可使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<input type="text">
<button id="btn">获取</button>
<script>
$('#btn').click(function(){
$('#btn').text('倒计时30s');
$('#btn').prop('disabled',true);
// 设置 cookie 值
$(document)[0].cookie = 'ckey='+30;
console.log('cookie 设置完毕'); });
function setStyle(){
var cval = getCookie();
if(cval>1){
$('#btn').text('倒计时'+cval+'s');
$('#btn').prop('disabled',true);
console.log('hahah')
}else{
$('#btn').text('获取验证码');
$('#btn').prop('disabled',false);
}
}
setStyle(); id = setInterval(function(){
setCookie();
console.log(1);
},1000) function setCookie(){
var cval = getCookie();
if(cval>1){
$(document)[0].cookie = 'ckey='+(cval-1);
$('#btn').text('倒计时'+(cval-1)+'s');
$('#btn').prop('disabled',true);
}else if(cval==1){
$('#btn').text('获取验证码');
$('#btn').prop('disabled',false);
$(document)[0].cookie = 'ckey='+0;
// clearInterval(id);
}
}
function getCookie(){
// 获取全部的 cookie
var cookie = $(document)[0].cookie;
// 获取 cookie 项 (数组)
var citem = cookie.split(';');
// 过滤数组 获得 键为 ckey 的项
var ckey = citem.filter(function(item){
return item.split('=')[0].trim()=='ckey';
});
// 获得 时间 cval
cval = ckey[0].split('=')[1];
return cval;
}
</script>
</body>
</html>
jQuery实现发送验证码30s倒计时,且刷新页面时有效的更多相关文章
- JS倒计时(刷新页面不影响)的实现思路
最近在做一个项目,用到了点击按钮实现倒计时,这个用js来实现很简单.但是遇到了一个问题 页面刷新后js重新加载导致 倒计时重新开始,或者直接初始化了 后来通过 cookie 保存来实现了js倒计时,关 ...
- 刷新页面时 select值保持不变
刷新页面时,要使下拉菜单(select).raido保持不变,用ajax是无法实现的.我想只能通过cookies才能实现.刷新前先把select或radio的值保存在cookies中,刷新后再填回去. ...
- jQuery实现发送验证码倒计时60秒
前端HMTL: <div class="form_box"> <div class="line mb40"> <div class ...
- jQuery手机发送验证码倒计时代码
<!DOCTYPE> <html> <head> <meta charset="UTF-8"> <script type=&q ...
- 发送验证码60s倒计时实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【积累】发送验证码按钮倒计时js
注册的时候要发送验证码,就上网研究了一下,写了一个简单点的... jsp页面: <input type="button" id="testbtn" val ...
- 解决让刷新页面时不提示 "重试或取消”对话框
如果刷新一个已经提交过的页面时,系统总是会提示一个 "重试或取消”的对话框.,如果是一个普通的页面,好象也无所谓,有就有,大不了多点一下.但是当我们是在子窗体中刷新父窗体时,就显得有点多余了 ...
- 解决vuex保存的数据刷新页面时清空
参考文章: vuex中store保存的数据,刷新页面会清空 主要解决代码: 1.更改store文件下index文件state的定义 const store = new Vuex.Store({ sta ...
- js发送验证码(倒计时)
需求:在用户点击获取验证码后60s内不能再次获取 代码 //倒计时60秒 var countdown=60; //显示获取验证码倒计时的文本标签 var _generate_code =$(" ...
随机推荐
- nginx文件名逻辑漏洞_CVE-2013-4547漏洞复现
nginx文件名逻辑漏洞_CVE-2013-4547漏洞复现 一.漏洞描述 这个漏洞其实和代码执行没有太大的关系,主要原因是错误地解析了请求的URL,错误地获取到用户请求的文件名,导致出现权限绕过.代 ...
- mysql协议分析1---报文的格式和基本类型
navicat 和 mysql 是一对好基友,每天都有非常频繁的交流,主人在navicat上写下每条sql语句,轻轻的点了下执行按钮,navicat就飞快的把主人的指令传送到mysql那里,mysql ...
- Linux学习(一)--VMware下Linux安装和配置
本片随便将给大家讲述linux在VM虚拟机上安装及终端的安装和配置 一.Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线 ...
- js里的window对象
alert(<msg>) 向用户显示对话框窗口并等候其被关闭 blur() 让窗口失去键盘焦 ...
- spring学习笔记之---bean属性注入
bean属性注入 (一)构造方法的属性注入 1.Student.java package entity; public class Student { private String name; pri ...
- Docker相关地址
Docker社区版(CE)地址: https://hub.docker.com/search/?type=edition&offering=community Docker文档地址: http ...
- Cobbler 自动安装CentOS7
1. Cobbler介绍 Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装.重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等.Cobbler可以使用命 ...
- Promise 学习心得
当了这么久码农到今天没事才开始去深究 Promise 这个对象 什么是 Promise, Promise 有什么用? 在写代码的时候多多少少都有遇见过地狱式的回调 代码看起来没问题就是有点乱,Prom ...
- JavaWeb——JSP开发2
使用JSP+Servlet实现文件的上传和下载功能 1.文件模型 首先是文件本身,这里创建一个类记录文件的名字和内容: public class Attachment { private String ...
- cmd命令行带参启动程序
cmd命令行带参启动程序 有一些程序不支持被直接启动,编写代码时,我们可以通过Process类来启动某个进程(某个软件),在不用代码调从而启动某个软件时,windows系统下,通常我们会用到cmd命令 ...