时间:2021-05-26
无意中测试AJAXRequest浏览器兼容性的时候,发现AJAXRequest.update方法在某些情况下在IE里有问题,经过测试找到是setTimeout和setInterval的问题。
问题出现在当调用AJAXRequest.update方法时,如果带了更新间隔及更新次数,那么在IE下面就会出现问题,具体表现为带了更新间隔时是函数工作,带上更新次数时函数无法在更新指定次数后停止执行。
测试几个例子之后找到了问题所在,在IE里,setTimeout和setInterval是不支持参数传递的。
演示地址:http://www.xujiwei.cn/demo/usetimer/
在Netscape的JavaScript参考中找到setTimeout的语法如下:
复制代码 代码如下:
setTimeout
Evaluatesanexpressionorcallsafunctiononceafteraspecifiednumberofmillisecondselapses.
语法
setTimeout(expression,msec)
setTimeout(function,msec,arg1,...,argN)
参数
expressionAstringcontainingaJavaScriptexpression.
msecAnumericvalueornumericstring,inmillisecondunits.
functionAnyfunction.
arg1,...,argN(Optional)Thearguments,ifany,passedtofunction.
第二种使用方法就是定义了一个定时器,在执行时function时,将把调用setTimeout时定义的参数传递给function,但在IE中,并不支持这种方式的调用,也就是在执行function的时候,函数并没有接收到这些参数。如下面的例子:
复制代码 代码如下:
<scripttype="text/javascript">
functionshow(str){
alert("mysite:"+str);
}
setTimeout(show,100,"www.xujiwei.cn");
</script>
在Firefox和Opera里,浏览器都能正确的弹出提示框显示字符串“mysite:www.xujiwei.cn”,而在IE里,显示的则是“mysite:undefined”,说明函数show并没有接收到参数str,所以显示出来就是一个未定义变量。
当然,如果在函数内部使用的变量是全局变量时,就不必要考虑这些问题,如:
复制代码 代码如下:
<scripttype="text/javascript">
functionshow(){
//url是全局变量,函数正确执行
alert("mysite:"+url);
}
varurl="www.xujiwei.cn";
setTimeout(show,100);
</script>
这段代码在IE和Firefox里都能正常工作,显示出“mysite:www.xujiwei.cn”。
在变量是全局变量的情况下,可以使用语句段的方式来调用setTimeout,即使用第一种语法:
复制代码 代码如下:
<scripttype="text/javascript">
functionshow(str){
//url是全局变量,函数正确执行
alert("mysite:"+str);
}
varurl="www.xujiwei.cn";
setTimeout("show(url);",100);
</script>
因为变量url是全局变量,因此定时器执行所定义的语句段“show(url);”能正确传递参数,但是如果url不是全局变量,而是一个局部变量时,执行结果就会出错了:
复制代码 代码如下:
<scripttype="text/javascript">
functionshow(str){
//url是全局变量,函数正确执行
alert("mysite:"+str);
}
functiontest(){
varurl="www.xujiwei.cn";
setTimeout("show(url);",100);
}
test();
</script>
此时就会出错了,在函数test执行时,会提示url未定义,在执行定义的语句段“show(url);”时,上下文已经脱离了函数test,而url是在函数test内部定义的,所以在执行函数test的时候,变量url已经释放了。
如果要在setTimeout里面使用局部变量,并且解决在IE里的setTimeout不支持参数传递的问题,可以使用匿名函数,即在调用setTimeout时定义一个匿名函数,在这个函数内部进行原来需要进行的操作。
复制代码 代码如下:
<scripttype="text/javascript">
functionshow(str){
//url是全局变量,函数正确执行
alert("mysite:"+str);
}
functiontest(){
varurl="www.xujiwei.cn";
setTimeout(function(){show(url);},100);
}
test();
</script>
在上面的例子中,调用setTimeout时定义了一个匿名函数,它的函数体是“show(url);”,因为已经定义了函数,所以在定时器调用这个函数时,变量url还是有引用的,因些函数可以正确执行,显示出字符串“mysite:www.xujiwei.cn”。
总的来说,使用setTimeout或者setInterval时需要注意以下几点:
1.定义定时器时如果是使用的表达示,那么其中的变量应该是全局变量,或者是一个直接的值,而不能是局部变量。
2.定义定时器时如果是定义的调用函数,那么应该只写函数名,而不能加括号,如果加了就是定义返回值了。
3.在IE里使用定时器时不能传递参数。
4.如果要在IE里使用定时器时传递参数,可以使用匿名函数,在函数体中调用原来该调用的函数。
如有错误还请指正。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
相信对于网页制作师来说,头疼的就是调网页在浏览器中的兼容性。那么本文就来谈一下应如何理解浏览器兼容性? 所谓浏览器兼容性指的是做出的网页在不同的浏览器中浏览时
手机是没有兼容性模式的,因为兼容性模式是针对pc端的网页和浏览器一种模式。所谓兼容性模式是pc端的一些浏览器可能存在双核的浏览器,一个是webkit内核一个ie
浏览器兼容性是前端工程师最头疼的问题,因为在不同的浏览器下浏览同一个页面可能会显示不同的效果。 什么是网站兼容性?所谓网站兼容性,就是用不同的浏览器浏览同
浏览器兼容性是前端工程师最头疼的问题,因为在不同的浏览器下浏览同一个页面可能会显示不同的效果 什么是网站兼容性?所谓网站兼容性,就是用不同的浏览器浏览同一个网
一、浏览器的兼容性现在浏览器有许多种,比如360、火狐、IE等,在制作网页时就应该考虑各种浏览器的兼容性。设计网站时,对于色彩、线条、图形等运用要保证在各种浏览