ajax timeout 与浏览器默认timeout,window_setTimeout和setInterval的浏览器兼容性分析,无意中测试AJAXRequest浏览器兼 - phpStudy...
setTimeout和setInterval的浏览器兼容性分析
无意中测试AJAXRequest浏览器兼容性的时候,发现AJAXRequest.update方法在某些情况下在IE里有问题,经过测试找到是setTimeout和setInterval的问题。
问题出现在当调用AJAXRequest.update方法时,如果带了更新间隔及更新次数,那么在IE下面就会出现问题,具体表现为带了更新间隔时是函数工作,带上更新次数时函数无法在更新指定次数后停止执行。
测试几个例子之后找到了问题所在,在IE里,setTimeout和setInterval是不支持参数传递的。
演示地址:http://www.xujiwei.cn/demo/usetimer/
在Netscape的JavaScript参考中找到setTimeout的语法如下:
复制代码 代码如下:
setTimeout
Evaluates an expression or calls a function once after a specified number of milliseconds elapses.
语法
setTimeout(expression, msec)
setTimeout(function, msec, arg1, ..., argN)
参数
expression A string containing a JavaScript expression.
msec A numeric value or numeric string, in millisecond units.
function Any function.
arg1, ..., argN (Optional) The arguments, if any, passed to function.
第二种使用方法就是定义了一个定时器,在执行时function时,将把调用setTimeout时定义的参数传递给function,但在IE中,并不支持这种方式的调用,也就是在执行function的时候,函数并没有接收到这些参数。如下面的例子:
复制代码 代码如下:
function show(str) {
alert("my site: "+str);
}
setTimeout(show,100,"www.xujiwei.cn");
在Firefox和Opera里,浏览器都能正确的弹出提示框显示字符串“my site: www.xujiwei.cn”,而在IE里,显示的则是“my site: undefined”,说明函数show并没有接收到参数str,所以显示出来就是一个未定义变量。
当然,如果在函数内部使用的变量是全局变量时,就不必要考虑这些问题,如:
复制代码 代码如下:
function show() {
// url是全局变量,函数正确执行
alert("my site: "+url);
}
var url="www.xujiwei.cn";
setTimeout(show,100);
这段代码在IE和Firefox里都能正常工作,显示出“my site: www.xujiwei.cn”。
在变量是全局变量的情况下,可以使用语句段的方式来调用setTimeout,即使用第一种语法:
复制代码 代码如下:
function show(str) {
// url是全局变量,函数正确执行
alert("my site: "+str);
}
var url="www.xujiwei.cn";
setTimeout("show(url);",100);
因为变量url是全局变量,因此定时器执行所定义的语句段“show(url);”能正确传递参数,但是如果url不是全局变量,而是一个局部变量时,执行结果就会出错了:
复制代码 代码如下:
function show(str) {
// url是全局变量,函数正确执行
alert("my site: "+str);
}
function test() {
var url="www.xujiwei.cn";
setTimeout("show(url);",100);
}
test();
此时就会出错了,在函数test执行时,会提示url未定义,在执行定义的语句段“show(url);”时,上下文已经脱离了函数test,而url是在函数test内部定义的,所以在执行函数test的时候,变量url已经释放了。
如果要在setTimeout里面使用局部变量,并且解决在IE里的setTimeout不支持参数传递的问题,可以使用匿名函数,即在调用setTimeout时定义一个匿名函数,在这个函数内部进行原来需要进行的操作。
复制代码 代码如下:
function show(str) {
// url是全局变量,函数正确执行
alert("my site: "+str);
}
function test() {
var url="www.xujiwei.cn";
setTimeout(function(){show(url);},100);
}
test();
在上面的例子中,调用setTimeout时定义了一个匿名函数,它的函数体是“show(url);”,因为已经定义了函数,所以在定时器调用这个函数时,变量url还是有引用的,因些函数可以正确执行,显示出字符串“my site: www.xujiwei.cn”。
总的来说,使用setTimeout或者setInterval时需要注意以下几点:
1. 定义定时器时如果是使用的表达示,那么其中的变量应该是全局变量,或者是一个直接的值,而不能是局部变量。
2. 定义定时器时如果是定义的调用函数,那么应该只写函数名,而不能加括号,如果加了就是定义返回值了。
3. 在IE里使用定时器时不能传递参数。
4. 如果要在IE里使用定时器时传递参数,可以使用匿名函数,在函数体中调用原来该调用的函数。
如有错误还请指正。相关阅读:
让人期待的2011年度最佳 jQuery 插件分享
CSS 循序渐进(二)字的艺术
jQuery.Switchable整合插件用途介绍
使用Oracle SQL trace时需要注意的问题
JavaScript中两个感叹号的作用说明
php实现的MySQL通用查询程序
基于jQuery的表格操作插件
用jscript实现新建和保存一个word文档
浅析PHP水印技术
JavaScript 事件的一些重要说明
Windows Server 2008下高效域管理体验
用PHP实现多级树型菜单
javascript:完全容错和浏览器自动最大化
PHP 配置open_basedir 让各虚拟站点独立运行
ajax timeout 与浏览器默认timeout,window_setTimeout和setInterval的浏览器兼容性分析,无意中测试AJAXRequest浏览器兼 - phpStudy...相关推荐
- 浏览器默认标签样式总结及css初始化程序(转)
浏览器默认标签样式总结及css初始化程序 html中的大部分的标签都有一些糟糕的样式,有的是标签天然自带的,有的是浏览器默认设置的,我们在写网页时,这些默认的样式就会时不时的跳出来捣一下乱,搞得我们很 ...
- 火狐浏览器默认安装c盘
火狐浏览器默认安装c盘 问题描述 解决办法 问题描述 下载好的浏览器执行文件 不仅没有自定义安装位置,还自动安装在了c盘烦烦烦 没错你是下错安装包了 解决办法 1 点击框中按钮 2 点击框中按钮 1运 ...
- Ajax网络请求超时处理-timeout
1.相关链接:http://blog.csdn.net/zrcj0706/article/details/78639980 2.实现效果 当网络请求时间超过2秒,则弹出提示框:提示网络不稳定 具体效果 ...
- [css] 你用过css的tab-size属性吗?浏览器默认显示tab为几个空格?
[css] 你用过css的tab-size属性吗?浏览器默认显示tab为几个空格? tab-size 属性规定制表符(tab)字符的空格长度.在 HTML 中,制表符(tab)字符通常显示为一个单一的 ...
- 让360安全浏览器默认使用谷歌内核
浏览器默认内核的指定只需在head标签中添加一行代码即可: 若页面需默认用极速核,增加标签:<meta name="renderer" content="webk ...
- 去苹果浏览器默认样式
去苹果浏览器默认样式 input,textarea,button { -webkit-appearance: none; border-radius:0px; border:none;} 转载于:ht ...
- js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 转载...
js添加事件.移除事件.阻止冒泡.阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 网上有关这方面的代码比较多而乱,这里整理一下并加以改进. 添加事件 01 var addEvent = ...
- html 将盒子固定浏览器,浏览器默认css样式表 css之左盒子固定,右盒子自适应的一种实现方式...
浏览器默认css样式表 在页面布局或者是列表布局中,我们经常出现一个场景:左边是固定宽度的盒子,右边自适应:div>label>Open... maoguiyou 2016年09月13日 ...
- java 浏览器设置字体大小_Sass可以在不使用REM的情况下访问浏览器的默认字体大小吗?...
有没有办法从Sass中访问浏览器的默认字体大小设置但不使用REM? 情况:我正在设置Sass函数和mixins,这将让我使用基于rem的垂直基线网格(垂直节奏,如果你愿意的话) . 使用REM我可以将 ...
最新文章
- 大掌柜商业管理系统服务器地址,大掌柜软件通用版操作说明.doc
- iptables配置管理
- OpenCV——KNN分类算法 摘
- NLP汉语自然语言处理入门基础知识介绍
- 删除word菜单栏上的adobe comments的终极办法
- Mysql数据库的瓶颈处理一点建议
- MicroPython (一)点亮我的Led
- gatsby_如何将静态Gatsby应用程序部署到Heroku
- 墙裂推荐 | 漫画解读Elasticsearch原理,看完你就懂
- 使用Redis构建简单的社交网站
- jwplayer html插件,Angular4使用经验之:jwplayer插件运用到angular4插件普适法
- ajax帝国cms登录,帝国CMS7.5二次开发之制作Ajax版登陆注册二合一插件(不改系统文件)...
- ❤️【独家】挑战全网最通俗易懂的神经网络的表达能力解释
- 如何在 IDE 中将程序打成 jar 包 Library handing 三种方式讲解 如何编写 MANIFEST.MF
- Velodyne VLP16 WIN下配置
- 全文检索语句中的AND和OR的用法
- The Sandbox 的 OliveX Fitness 之城来啦!
- 行内元素和块级元素:内联(行级)元素不能设置margin-top
- 纽约证交所代码表 zt
- C# 绘制验证码图片
热门文章
- 出现身份验证错误,无法连接到本地安全机构,远程计算机:192.168.*.*,这可能是由于密码过期,如果密码已过期请更新密码。如需帮助,请于管理员或技术支持人员联系。”
- MySQL数据库实战教程
- Unity Animation从UAS获取动画资产到编制状态机控制简单的人物动画
- CarSim仿真快速入门(二十二)—CarSim2022中设置IO写出
- android+集成北斗定位,基于Android系统的北斗定位通信手持设备研究
- HCL配置二层动态链路聚合实验
- 3天ruby入门到实战笔记
- 【Verilog】二、Verilog基础语法
- 游戏本天梯_大数据汇总!天梯黑金传奇段位玩家阵容分析!
- win7 linux双系统引导修复工具,给你传授双系统引导修复工具【搞定指南】