JavaScript倒计时,实现起来不难,但是一刷新往往就重新计算了,如果要实现刷新不重计该如何做呢?

有这么几种思路,

1:cookie

2:本地缓存

3:window.name ……

window.name是一个window对象下的属性,当我们在同一窗口浏览的时候,这个值都可以被页面读取

前两种比较容易理解,今天我来为大家实现使用window.name实现刷新不重计,代码如下:

<body>

<input type="button" id="btn" value="免费获取验证码" onclick="settime(this)" />

<script type="text/javascript">

var maxtime = 60;

if(window.name == '' || window.name == '-1' || isNaN(window.name)) {

maxtime = 1 * 60;

} else {

maxtime = window.name;

}

function settime(val) {

if(maxtime == 0) {

val.removeAttribute("disabled");

val.value = "免费获取验证码";

maxtime = 60;

} else {

val.setAttribute("disabled", true);

val.value = "重新发送(" + maxtime + ")";

maxtime--;

window.name = maxtime;

}

setTimeout(function() {

settime(val)

}, 1000)

}

</script>

</body>

使用 window.name 解决跨域问题

window.name 传输技术,原本是Thomas Frank用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等)而发明的(详细见原文:Session variables without cookies》),后来Kris Zyp在此方法的基础上强化了 window.name 传输 ,并引入到了Dojo dojox.io.windowName),用来解决跨域数据传输问题。

window.name 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

window.name 传输技术的基本原理和步骤为:

name 在浏览器环境中是一个全局/window对象的属性,且当在 frame 中加载新页面时,name 的属性值依旧保持不变。通过在 iframe 中加载一个资源,该目标页面将设置 frame 的 name 属性。此 name 属性值可被获取到,以访问 Web 服务发送的信息。但 name 属性仅对相同域名的 frame 可访问。这意味着为了访问 name 属性,当远程 Web 服务页面被加载后,必须导航 frame 回到原始域。同源策略依旧防止其他 frame 访问 name 属性。一旦 name 属性获得,销毁 frame 。

在最顶层,name 属性是不安全的,对于所有后续页面,设置在 name 属性中的任何信息都是可获得的。然而 windowName 模块总是在一个 iframe 中加载资源,并且一旦获取到数据,或者当你在最顶层浏览了一个新页面,这个 iframe 将被销毁,所以其他页面永远访问不到 window.name 属性。

基本实现代码,基于YUI,源自克军写的样例

(function(){
    var YUD = YAHOO.util.Dom, YUE = YAHOO.util.Event;
   
    dataRequest = {
        _doc: document,
        cfg: {
            proxyUrl: 'proxy.html'
        }
    };

dataRequest.send = function(sUrl, fnCallBack){
        if(!sUrl || typeof sUrl !== 'string'){
            return;
        }
       
        sUrl += (sUrl.indexOf('?') > 0 ? '&' : '?') + 'windowname=true';

var frame = this._doc.createElement('iframe'), state = 0, self = this;
        this._doc.body.appendChild(frame);
        frame.style.display = 'none';

var clear = function(){
            try{
                frame.contentWindow.document.write('');
                frame.contentWindow.close();
                self._doc.body.removeChild(frame);
            }catch(e){}
        };

var getData = function(){
            try{
                var da = frame.contentWindow.name;
            }catch(e){}
            clear();
            if(fnCallBack && typeof fnCallBack === 'function'){
                fnCallBack(da);
            }
        };

YUE.on(frame, 'load', function(){
            if(state === 1){
                getData();
            } else if(state === 0){
                state = 1;
                frame.contentWindow.location = self.cfg.proxyUrl;
            }
        });

frame.src = sUrl;
    };    
})();

Web 服务器如何提供 window.name 数据

为了让 Web 服务器实现 window.name,服务器应该只寻找请求中是否包含 windowname 参数。如果包含了 windowname 参数,服务器应该返回一个设置了 window.name 字符串值的 HTML 文档,回应此请求并传送到客户端。例如: http://www.planabc.net/getdata.html?windowname=true

如果服务器想用 Hello 响应客服端,它应该返回一个 HTML 页面:

<html>
    <script type="text/javascript">
        window.name="Hello"; 
    </script>
</html>

同样也可以转换为 JSON 数据:

<html>
    <script type="text/javascript">
        window.name='{"foo":"bar"}'; 
    </script>
</html>

如果你手动创建资源,书写大量的多行的 JSON 对象为一个引用的字符串应该是比较困难的并且易于出错的。可以使用这样的 HTML 样例简单的创建 JSON 数据,将会转换为一个 JSON 字符串而无需手动转义 JSON 为字符串:

<html>
    <script type="\'text/javascript\'">
        window.name = document.getElementsByTagName("script")[0].innerHTML.match(/temp\s*=([\w\W]*)/)[1];
        temp= {
            foo:"bar", // put json data here
            baz:"foo"
        }  
    </script> 
</html>

同样的,如果你想传递 HTML/XML 数据,这里有一个样例实现,而无需手动将这些数据转换成字符串:

<html>
    <body>
        <p id="content">  
            some <strong>html/xml-style</strong>data  
        </p>  
    </body>  
    <script type="text/javascript"> 
        window.name = document.getElementById("content").innerHTML;  
    </script>
</html>

window.name 传输技术相比其他的跨域传输的一些优势:

1.它是安全的。也就是说,它和其他的基于安全传输的 frame 一样安全,例如 Fragment Identifier messaging (FIM)和Subspace(I)Frames 也有他们自己的安全问题,由于 frame 可以改变其他 frame 的 location,但是这个是非常不同的安全溢出,通常不太严重。

2.它比 FIM 更快,因为它不用处理小数据包大小的 Fragment Identifier ,并且它不会有更多的 IE 上的“机关枪”声音效果。它也比 Subspace 快,Subspace 需要加载两个 Iframe 和两个本地的 HTML 文件来处理一个请求。window.name 仅需要一个 Iframe 和一个本地文件。

3.它比 FIM 和 Subspace 更简单和安全。FIM 稍微复杂,而 Subspace 非常复杂。Subspace 也有一些额外的限制和安装要求,如预先声明所有的目标主机和拥有针对若干不同特殊主机的 DNS 入口。window.name 非常简单和容易使用。

4.它不需要任何插件(比如 Flash)或者替代技术(例如 Java)。

js60秒倒计时防刷新相关推荐

  1. 云开发小程序倒计时防刷新功能及签到功能

    小程序倒计时防刷新功能 这是一个不美好的事情,我使用的是vant的倒计时,不管什么倒计时,刷新后倒计时就会重新开始.从晚上查到下班,从回家查到11点,结果没找到,没办法了自己写,结果10min写出来了 ...

  2. JS点击获取验证码后60秒内禁止重新获取(防刷新)

    JS点击获取验证码后60秒内禁止重新获取(防刷新) 参考 · 阅读文章: JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效) 注意: 场景:在登录页点击发送啊验证码按钮,开始进入倒计时,在第3 ...

  3. Vue回炉重造之封装防刷新考试倒计时组件

    你好,我是Vam的金豆之路,可以叫我豆哥.2019年年度博客之星.技术领域博客专家.主要领域:前端开发.我的微信是 maomin9761,有什么疑问可以加我哦,自己创建了一个微信技术交流群,可以加我邀 ...

  4. 普歌-Vue 封装防刷新考试倒计时组

    date.vue <!-- 定时器组件 --> <template><div class=""><p>{{ count }}< ...

  5. 留言系统 php 防攻击,php 留言板防刷新

    php 留言板防刷新效果      $ip = $_SERVER['REMOTE_ADDR']; $conn = mysql_connect($mysql_server_name, $mysql_us ...

  6. 免费获取验证码60秒倒计时

    免费获取验证码60秒倒计时 <!DOCTYPE html> <html> <head> <script src="http://libs.baidu ...

  7. 基于单片机的c语言倒计时程序,30秒倒计时c语言51单片机实现.doc

    30秒倒计时c语言51单片机实现 原理图: 程序: #include #define uchar unsigned char #define uint unsigned int sbit dula=P ...

  8. 简单实现vue验证码60秒倒计时功能

    简单实现vue验证码60秒倒计时功能 <span v-if="codeShow" @click="getPhoneCode">点击获取验证码< ...

  9. 榛子云短信-微信小程序60秒倒计时插件

    为了帮助开发者更便捷的使用微信小程序的短信验证码功能,特别是初学者更好的使用,榛子云短信特地开发了60秒倒计时插件,效果: 使用方法 1.引入插件countdown.js var CountDown ...

最新文章

  1. 自动驾驶软件工程之全局规划
  2. leetcode第二题java_LeetCode第二题,Java实现
  3. jffs2 告警 和 一般性错误
  4. (000) java后台开发之指导思想
  5. 邮件excel html,小数点分隔符在电子邮件(HTML/CSS)在Excel的VBA编程
  6. asp.net中将枚举绑定到下拉列表
  7. Java实现消息发送
  8. linux中 /dev/null命令
  9. blender使用_DigiVita使用Blender教女孩编码
  10. UE4次世代的移动平台渲染技术
  11. weblogic中删除自动部署项目
  12. 海康摄像头如何查看IP,重置密码
  13. 计算机excel宏代码怎么写,教你如何使用Excel VBA VBA新手必看
  14. 四 树莓派系统配置及进入图形桌面
  15. 计算机专业有必要数学竞赛吗,高中数学竞赛必要吗
  16. 看得见的数据结构Android版之二分搜索树篇
  17. linux的ls命令详解(四)(几种常用的ls选项排序命令)
  18. html下拉框原理,html下拉框获取value属性
  19. C++ OpenCV【人脸识别人眼识别】
  20. 字符串实质,sizeof strlen

热门文章

  1. 控制抽象之简化客户代码
  2. [日志]家居清洁十大秘笈
  3. 有关DataVisualization类组件的研究——Silverlight学习笔记[43]
  4. jdk的selector(2)channel的注册
  5. python黑白棋结课设计报告_黑白棋游戏课程设计
  6. python制作窗口界面_python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
  7. 解决开发问题的思路与心态
  8. 百度编辑器ueditor自适应手机端
  9. RocketMQ的组织架构和基本概念,Dledger高可用集群架构原理
  10. SpringMVC框架搭建( 使用Jar包搭建)