js jquery中的延时方法(set/clearTimeout)
来源:互联网 发布:2016网络新词 日语 编辑:程序博客网 时间:2024/05/18 11:45
js jquery中的延时方法(set/clearTimeout)
起因:当一个标签同时拥有单击和双击事件时,为了区分开单双击事件,在双击事件中需要对单击事件进行延时,然后再清除单击事件。故而用到了setTimeout和clearTimeout方法,其中延时的时间的确定稍有不清楚的地方,故在此进行研究讨论。
1. 首先来看个例子:
例一
<html> <head> <script type="text/javascript" src="jquery-1.12.1.js"></script> </head> <body> <input type="button" id="testBtn" value="单击我或者双击我"> <script language="javascript"> var a = 0; $("#testBtn").on("click",function(){ console.log("this is click event"); console.log("a=" + a++); }); $("#testBtn").on("dblclick",function(){ console.log("this is dblclick event"); console.log("a=" + a++); }); </script> </body></html>
双击时以上代码在浏览器控制台中的输出结果是:
this is click eventa=0this is click eventa=1this is dblclick eventa=2
分析: 一次双击事件中会有多余的两次单击事件,需要将两次单击事件都清除才可以区分出双击事件。
清除方法的实例:
例二
<html> <head> <script type="text/javascript" src="jquery-1.12.1.js"></script> </head> <body> <input type="button" id="testBtn" value="单击我或者双击我"> <script language="javascript"> var a = 0; var timeoutID= null; $("#testBtn").on("click",function(){ clearTimeout(timeoutID); timeoutID= window.setTimeout(function(){ console.log("this is click event"); console.log("a=" + a++); }, 300); }); $("#testBtn").on("dblclick",function(){ clearTimeout(timeoutID); console.log("this is dblclick event"); console.log("a=" + a++); }); </script> </body></html>
双击时以上代码在浏览器的控制台中的输出结果是:
this is dblclick eventa=0
若将300改为0-100中任意数值,其输出结果是:
this is click eventa=0this is dblclick eventa=1
结果分析:
1. 在添加延时后,双击事件中只有一次单击事件了(即使延时为0也如此);
2. 在添加延时大于300毫秒后,可以清除双击事件中的单击事件。
例三,原因分析。
<html> <head> <script type="text/javascript" src="jquery-1.12.1.js"></script> </head> <body> <input type="button" id="testBtn" value="单击我或者双击我"> <script language="javascript"> var a = 0; var timeoutID= null; $("#testBtn").on("click",function(){ clearTimeout(timeoutID); if(a!=0){ console.log("this is click 2 event"); console.log("a=" + a++); }else{ timeoutID= window.setTimeout(function(){ console.log("this is click event"); console.log("a=" + a++); }, 0); } }); $("#testBtn").on("dblclick",function(){ clearTimeout(timeoutID); console.log("this is dblclick event"); }); </script> </body></html>
双击时以上代码在浏览器的控制台中的输出结果是:
this is click eventa=0this is click 2 eventa=1this is dblclick eventa=2
结果分析:
1. 原因 : js是单线程执行的,setTimeout的执行时间会被添加到js线程的执行队列中进行排队,其执行时间由js引擎线程按顺序执行的队列来决定。参考文章:http://www.jb51.net/article/30362.htm
也就是说设置了setTimeout延迟后,它并不是立刻执行的,要在js的单线程队列中排队等待,那么setTimeout实际响应时间应该是,排队时间+设置的延迟时间。
例二中只出现一次click事件是因为:在第二次click事件中setTimeout 延时在js单线程队列中排在了dbclick事件之后,所以第二次click事件中的setTimeout延时被dbclick事件中的clearTimeout方法清除了。即: js单线程队列中第二次click事件后面紧跟的是dbclick事件,在第二次click事件中的setTimeout事件排在了dbclick事件之后。
2. 原因: 在添加延时大于300毫秒后,可以清除双击事件中的单击事件。说明第一次click事件到dbclick事件在js单线程队列中的排队时间间隔大概为300毫秒。即将单击事件的动作延迟300毫秒,即可在其发生前在dbclick中把它们清除掉。
结论:
由以上分析可知,要分离双击事件中的单击事件,就需要设置延时时间,这个延时时间需要大于第一次单击事件响应到双击事件响应的时间。
2. 补充例子:
在上上一篇文章 js中单击和双击事件的区分 中有研究过一个双击事件包含了以下过程: mousedown,mouseup,click,mousedown,mouseup,click,dblclick。
例四
<html> <head> <script type="text/javascript" src="jquery-1.12.1.js"></script> </head> <body> <input type="button" id="testBtn" value="单击我或者双击我"> <script language="javascript"> var a = 0; var timeoutID= null; $("#testBtn").on("mousedown",function(){ console.log("this is mousedown event"); console.log("a=" + a++); }); $("#testBtn").on("mouseup",function(){ console.log("this is mouseup event"); console.log("a=" + a++); }); $("#testBtn").on("click",function(){ clearTimeout(timeoutID); timeoutID= window.setTimeout(function(){ console.log("this is click event"); console.log("a=" + a++); }, 100); }); $("#testBtn").on("dblclick",function(){ clearTimeout(timeoutID); console.log("this is dblclick event"); console.log("a=" + a++); }); </script> </body></html>
在浏览器控制台的输出结果是:
this is mousedown eventa=0this is mouseup eventa=1this is mousedown eventa=2this is click eventa=3this is mouseup eventa=4this is dblclick eventa=5
分析: 说明第一次click事件到第二次mousedown的时间间隔大约是100毫秒。
- js jquery中的延时方法(set/clearTimeout)
- jquery中的延时效果
- js计数器方法setInterval()、clearInterval()、setTimeout()和clearTimeout()
- js计数器方法:setInterval()和clearInterval();setTimeout()和clearTimeout()
- js延时执行方法
- js中的get和set方法(demo说明)
- 15. Window clearTimeout() 方法
- JavaScript setTimeout() clearTimeout() 方法
- 关于js中的get、set方法
- js调用jquery中的方法
- js延时执行一个方法
- clearTimeout
- 【C#】中的延时的方法。
- unity中的简单延时方法
- JS中的两个经常用的函数setTimeout和clearTimeout例子
- web前端,标签切换总结2setTimeout()延时执行clearTimeout()
- js、Jquery、AngularJs中的extend方法
- Jquery hover方法的效果延时处理
- android复习路之java基础上
- SpringMVC的各种参数绑定方式
- MySQL5.7 linux二进制安装
- mysql 一个死锁的分析
- 大家都应该懂的设计模式——单例模式
- js jquery中的延时方法(set/clearTimeout)
- 四大php框架rbac功能分析
- web前端规范 通用规范
- 简要线程池工作原理
- InstallShield 2015 Premier的Basic MSI Project如何在卸载时删除残留的文件
- mysql视图详解
- Open Source Software for Remote Sensing
- 禁止Centos系统You have new mail in /var/spool/mail/root提示
- 解决:Ubuntu14.04使用vi编辑器时输入异常且按方向键乱码