setinterval 和 setTimeout调用方式以及浏览器缓存问题
js中setinterval 和 setTimeout 可以做定时器,这个大家都知道,
关于这两个方法的区别,网上也有很多文章说的很清楚。
在此我还想说一说2个问题:
1,关于调用方式的书写。
比如:
function showCallInAndOut(){
//xxx
}
//setTimeout("showCallInAndOut()",1000);
//setTimeout(showCallInAndOut,1000);
上面的这两中调用方式都是对的!!!
如果第一个参数是字符串,那里面的方法名需要带括号;
如果第一个参数是变量,就直接写变量名(方法名),不能带括号。
下面是例子,包括传参的调用:
<html>
<head>
<title> New Document </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="jquery-1.7.1.js" type="text/javascript"></script>
</head>
<body>
<input type="text" value="" id="inter"/>
</body>
</html>
<script>
var aaa=1;
function showCallInAndOut(){
$("#inter").val("showCallInAndOut调用"+aaa+"次");
aaa++;
}
var bbb=1;
function sayHi(word){
$("#inter").val("sayHi调用"+bbb+"次,参数是:"+word);
bbb++;
}
//setInterval("showCallInAndOut()",1000); //正确
//setInterval(showCallInAndOut,1000); //正确
//setTimeout("showCallInAndOut()",1000); //正确
//setTimeout(showCallInAndOut,1000); //正确
//传参的调用方式
var param="hi,gril!";
//setInterval("sayHi(param)",1000);//这个方式可以传参
//setInterval(sayHi,1000); //这个方式不能传参
//setTimeout("sayHi(param)",1000);//这个方式可以传参
//setTimeout(sayHi(param),1000);//这个方式不能传参
/*
传参的调用方式结果已经很明了了。
从结果我们可以猜想,如果传入字符串,那浏览器在底层可能调用了eval()方法。
如果传入变量,就直接调用这个变量,至于这个为什么不能传参,就不清楚了。
*/
</script>
2,关于在ajax做定时器调用的问题(每个一段时间发请求)。
假如我们要刷新页面上某个值,并且需要不断地,时时的刷新,大家都会想到
利用js的定时器不断发ajax请求,在回调函数中巴页面上的值改变这个思路。
在实际项目中,我遇到一个问题:
我使用setInterval定时调用一个方法showCallInAndOut(),
这个方法就是一个ajax。奇怪的是有时候定时刷新很正常,这和我初始的思路一致,
有时候,定时刷新就没有效果,我在后台打上断点,输出打印都没反应。
开始我以为是setInterval出了问题,就在这个方法里加了一行计数:
$("#inter").val("showCallInAndOut调用"+aaa+"次");
aaa++;
记过页面上这个aaa是一直变化的,也就是说setInterval一直正常!
那问题只能是里面的方法showCallInAndOut()有问题!
这个方法就是ajax,没什么特别的,可就是不调用,我甚至在页面加个按钮
直接调用这个showCallInAndOut()也没反应。
后来,我在页面初始化的时候调一下showCallInAndOut()刷新页面某个值。
然后再调用setInterval,当然这个setInterval里面还是调用showCallInAndOut()。
接着我再测试的时候发现,页面初始化时会调用,但是setInterval里面的却不调用!当我改变
数据库中的值,再刷新页面,这两个都不调用!
url绝对是正确的,为什么就不调用呢?由此我突然想到浏览器的缓存!
所以我在url后面加上一个随机参数。在页面初始化那个方法里不加随机参数,
在setInterval里面的方法加上随机参数。
结果:
2-1,初次进入那个页面:
页面初始化会调用,setInterval也调用。
2-2,我改变数据库的值,刷新那个页面时:
页面初始化会不调用,setInterval调用!
而且页面首先会显示前一次的数值!过了定时的那几秒后就会显示数据库实际的数值!
结果很明显,js方法肯定会调用,但是ajax请求不一定走!
为什么呢?浏览器缓存!
在ajax中请求的url在浏览器中是会留下缓存的!如果浏览器发现新的请求和以前的请求一模一样,
浏览器就直接把缓存中的结果拿出来了,这个请求就不走了。这不是什么新鲜的问题,我以前
也遇到过,就是在做图片上传的时候,第一次用户上传一张图片,在点击提交前又想改换另外一张图片(名字
是一样的),我在后台把图片名字改成用户的名字,这样图片的url总是一样的,即使真的上传了改变后的
图片,页面上还显示改变前的那一张!在url后面加上随机参数就没有问题了。归根到底,就是
浏览器缓存的问题。他认为你的请求或者url是和前面一样的,他就直接拿结果!ajax也一样!
就像我这一次做的2-2,之所以先显示以前的值(数据库已经变值了),页面还能显示出来,后后面
setInterval请求中我都加了随机参数,结果就显示正确的,后台代码也能走,这就是很清楚了。
页面初始化的那个url已经在浏览器有了缓存,你刷新页面,走这个方法时,ajax就没走,直接从缓存中取;
后面的setInterval请求url因为有了随机参数使url每次都不一样,浏览器只能重新发送请求,这样取到的值
就是正确的,数据库实际的值。
至于为什么不加随机参数时有时候setInterval能正常走,有时候不能原因就是:
正常走的情况浏览器没有缓存,不正常的时候是有了缓存。
那什么情况下浏览器才会留下缓存呢?这个哥们就不清楚了。
页面的url和请求最好加上随机变量,这样就会很有效地避免一些“诡异”问题,算是培养
良好的编码习惯吧。
至于随机参数,在这里我也说一下吧。
其实很简单,在url后面加一个参数。
比如:
"xxxxx/voice/getCallInInfo.action?ss=aaa";
这个ss如果是随机的,就可以。
在js中,我比较喜欢这样:
url: "<%=path%>/voice/getCallInInfo.action?ss="+Math.random()
在jsp中,就更好办了,利用日期,随机数等等生成一个无规律的字符串加在url后面就可以。
分享到:
相关推荐
这篇博客文章“setInterval引起的性能问题”探讨了这些问题以及如何避免它们。 首先,`setInterval`的定时并不精确。它并不是在指定间隔的精确时间点执行,而是在一个事件循环结束时执行,这意味着其执行时间受到...
大概半年前发表过一篇关于setTimeout和setInterval的文章,但是现在回去仔细一看发现其实存在很多不足以及错误。事实上,setTimeout和setInterval并没有我们字面上理解的那么简单。要真正掌握并理解这两个方法,还得...
JavaScript 提供了一种简单的方式来实现这个需求,主要通过 `location.reload()` 和 `setTimeout()` 函数来完成。 首先,`location.reload()` 是 JavaScript 中的一个方法,用于重新加载当前的文档或者指定的 URL。...
- 定时器和延时函数:如setTimeout和setInterval。 - Ajax请求和跨域问题:处理服务器通信和解决跨域限制。 8. ES6新特性: - let和const关键字:新的变量声明方式,提供了更好的作用域管理。 - 箭头函数:简洁...
12. **Web APIs**:浏览器提供了一系列API,如定时器(setTimeout/setInterval)、地理位置API、Web Storage(localStorage/sessionStorage)、WebSocket等,使得JavaScript可以与浏览器和用户设备深度交互。...
11. **跨域问题**:讲解同源策略以及如何通过JSONP、CORS等方式解决跨域问题。 12. **Promise和async/await**:深入理解异步编程模型,掌握Promise的链式调用和async/await的使用。 13. **Web API**:包括定时器...
3. 动画与定时器:使用setTimeout和setInterval实现动画效果,注意防抖和节流的使用。 四、AJAX与Fetch API 1. AJAX(Asynchronous JavaScript and XML):创建XMLHttpRequest对象,发送GET和POST请求,处理响应...
14. this指向:理解this的动态绑定,它取决于函数调用的位置和方式。 15. 异步编程进阶:包括async/await、Promise.all、Promise.race等,用于更优雅地处理异步操作。 16. 函数柯里化:将接受多个参数的函数转换为...
然而,使用普通函数(比如setInterval、setTimeout中)时,this通常指向全局对象window。因此,当在这些普通函数中尝试访问Vue实例中的data数据时,会遇到无法访问的问题。 接下来,文章中介绍了两种解决方法: 第...
宏任务是指那些需要浏览器或 Node.js 环境来执行的任务,例如 setTimeout、setInterval 等。微任务是指那些在当前执行栈为空时执行的任务,例如 Promise 的 resolve 函数。 在上面的代码中,我们可以看到 Promise ...
11. **合理使用var、let和const**:`let`和`const`的块级作用域特性优于`var`,避免变量提升带来的问题,但也要注意不要过度声明变量。 12. **使用最新的JavaScript语法**:ES6及以后的版本引入了许多新的特性和...
10. **使用requestAnimationFrame**:在动画处理中使用requestAnimationFrame替代setTimeout或setInterval,确保在浏览器准备绘制新帧时执行动画逻辑。 #### 二、高级语法与设计模式 1. **箭头函数**:箭头函数...
JavaScript的setInterval和setTimeout函数用于实现游戏的动画效果,如僵尸的移动、植物的生长等。通过周期性地改变元素的位置或状态,达到视觉上的连续动作。 5. **NAS与WebStation服务器部署** Network Attached...
16. **Web API**:如定时器(setTimeout、setInterval)、WebSocket用于实时通信、Geolocation获取地理位置等,都是JavaScript可以调用的浏览器内置功能。 这个"JavaScript实现功能全集"可能包含了以上提及的所有...
例如使用`setTimeout`、`setInterval`定时器模拟异步延迟效果;或者通过AJAX发起网络请求获取远程数据。 **模块化开发**:随着项目规模增长,合理划分功能模块不仅有助于代码复用还能降低维护成本。CommonJS和ES6 ...
使用setTimeout和setInterval可以提高JavaScript代码的性能,例如使用setTimeout代替while循环。 4. 避免使用eval函数 eval函数可以执行字符串中的JavaScript代码,但是它可以导致安全问题和性能问题。 编写高...
这些特效通常基于CSS样式改变和定时器(setTimeout或setInterval)实现。 6. **面向对象编程**:JavaScript支持面向对象编程,包括构造函数、原型链、闭包等概念。手册可能详细解释了如何利用这些特性进行模块化...
6. **BOM(浏览器对象模型)**:窗口对象(window)、导航(location)、历史记录(history)、定时器(setTimeout、setInterval)以及弹框(alert、prompt、confirm)等。 7. **ES6及以后的新特性**:块级作用域...
JavaScript是一种广泛应用于网页和网络应用的...总之,JavaScript的延时效果可以通过`setTimeout`和`setInterval`来实现,但实际使用中还需要考虑异步执行、性能优化、浏览器渲染机制等多个方面,以达到理想的效果。
综上所述,解决微信内嵌H5网页中的JS倒计时失效问题,关键在于防止浏览器缓存以及确保在页面重新激活时能正确获取服务器的最新数据。通过禁用缓存、实时更新或存储恢复等方式,可以有效地避免这类问题,从而提供良好...