bug记录-setTimeout、setInterval之IOS7
本篇文章主要讲查找并分析bug的思路,相关的函数不是本文的重点。
众所周知,setTimeout和setInterval是用来做延迟调用以及周期性调用的方法,他们支持的参数都差不多。
setTimeout/setInterval的第一个参数为回调函数,可以是一个方法名,也可以是一个匿名函数。第二个参数就是延迟执行的时间,单位ms。
我们可以这样用:
setTimeout(fn,1000);
function fn(){};
//还可以这样用
setTimeout(function(){},1000);
//interval一样
我们demo上设置的延迟时间是1000ms,由于js是单线程的,实际的延迟时间可能会比 1000ms长,但是只要进程空闲时就会立即执行。(这也是为什么建议使用setTimeout来代替setInterval的原因)
好了,方法都解释的差不多了,直插主题吧。
一个简单的需求,当用户输入错误时显示一个tips,并在x秒后隐藏,超级简单对不对,开搞。
function hide(){
//do hide
}
setTimeout(hide,5000)//在5000ms后做hide操作
uc,qq,chrome,什么国产手机自带浏览器都跑一遍吧,没任何问题,只有ios7的safari,如果一直滑动的话,不会执行延迟操作,只有停止滑动才会执行,而且是立即执行(大概延迟800ms左右)
比较棘手啊,这种情况有点像在有些浏览器上滑动时,gif动图会停止运动(有遇到过页面滑动,js动画都停止的),猜测会不会是一种优化手段呢,于是
var count =0,startTime=new Date().getTime(),endTime;
timer=setTimeout(function(){
//endTime = new Date().getTime();
var a = document.createElement("p");
a.innerText = endTime-startTime;
document.getElementById("demo").appendChild(a)
alert("ok"); },2000)
window.addEventListener("touchend",function(){
endTime = new Date().getTime();
count+=1;
var a = document.createElement("p");
a.innerText = startTime+"---"+endTime;
document.getElementById("demo").appendChild(a)
},false)
开始监听的是touchmove事件,证明滑动不会影响除延时函数以外的其他js执行。
监听touchend事件,滑动结束后并不是2000ms执行回调,测试大概是800ms左右。
根据上面的测试,我们能大概的来猜测下,ios7中safari做了滑动优化,在滑动的过程中阻止延迟事件的执行,在滑动结束后再执行。
解决方法
其实这种情况,没什么好解决的(不要打我),因为ios7的确是很老的系统了。但是我们为了精益求精还是得研究下的。
1.由于是滑动造成的,那我们直接干掉滑动吧,在hide以后再开启(在tips消失之前滑动不了页面)
2.做一个兼容,如果用户滑动了,记录滑动的开始时间和move时间,两个的差值如果大于延迟时间就直接执行回调
时间仓促,写的有点匆忙(今天星期五啊。。),如果有什么遗漏或者错误的地方欢迎指出
bug记录-setTimeout、setInterval之IOS7的更多相关文章
- js,onblur后下一个控件获取焦点判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval
需求: input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误.但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显 ...
- setTimeout/setInterval执行时机
setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的 ...
- js中setTimeout/setInterval定时器用法示例
js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...
- setTimeout,setInterval你不知道的…
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- setTimeout,setInterval你不知道的事
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- 【bug记录】OS Lab3 踩坑记
OS Lab3 踩坑记 Lab3在之前Lab2的基础上,增加了进程建立.调度和中断异常处理.其中测试包括进程建立以及进程调度部分. 由于是第一次做bug记录,而且是调试完bug后再做的记录,所以导致记 ...
- 微信小程序bug记录与解决
微信小程序bug记录 textarea textarea在模拟器上没有padding,可是在真机上会自带padding,而且在外部改不了,并且在安卓和IOS上padding还不一样 第一张图是在开发工 ...
- js异步处理工作机制(setTimeout, setInterval)
经常谈到异步,但是发现自己一直没深入理解setTimeout, setInterval,逛论坛的时候发现了这篇好文章,分享一下. ————————————————————以下为原文—————————— ...
- 管理页面的 setTimeout & setInterval
在管理 setTimeout & setInterval 这两个 APIs 时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员 —— {sto, siv} ...
随机推荐
- 武汉科技大学ACM :1010: 零起点学算法103——一只小蜜蜂...
Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一 ...
- redis配置文件redis.conf详细说明
# By default Redis does not run as a daemon. Use 'yes' if you need it.# Note that Redis will write a ...
- 禁止多行文本框textarea拖拽
禁止多行文本框textarea拖拽: textarea { resize: none; } resize这个是用于元素缩放,它可以取以下几个值: none 默认值 both 允许水平方向及垂直方向缩放 ...
- bat判断某个目录是否存在
使用批处理判断某个目录是否存在的语句. if not exist xxx_folder_name md xxx_folder_name
- python中列表和字典的高级应用
1.将序列分解为单独的变量 1.1问题 包含n个元素的元组或列表.字符串.文件.迭代器.生成器,将它分解为n个变量 1.2方案 直接通过赋值操作 要求:变量个数要等于元素个数 当执行分解操作时,有时需 ...
- 利用http实现文件的上传和下载
其他语言都比较方便,使用http上传.但是C++这样就差点,不过还好,Linux下有个curl的命令行工具,这是一个开源项目,底下有个子项目是libcurl,curl就是调用这个API实现的一系列ft ...
- DELPHI7如何调用带参数的JAVA WebService
对方提供的WebService地址是http://192.168.1.6:8080/test/pic?XH=XX用DELPHI如何调呢 ------解决方案--------------------通过 ...
- HDU_2049——部分错位排列,概率论
Problem Description 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样 ...
- 大型分布式C++框架《二:大包处理过程》
本来这一篇是打算写包头在分布式平台中的具体变换过程的.其实文章已经写好了.但是想了这个应该是不能随便发表的.毕竟如果知道了一个包的具体每个字节的意义.能伪造包来攻击系统.其次来介绍一个包的具体变换过程 ...
- Servlet的init()方法如何才会在服务器启动时执行
如果要想让 servlet 的 init () 方法在服务器启动 时就被执行,则需要在 web.xml 中相应的 servlet 下配置 <servlet > <servlet -n ...