jquery队列queue与原生模仿其实现方法分享


Posted in Javascript onMarch 25, 2014

queue() 方法显示或操作在匹配元素上执行的函数队列。

queue和dequeue的过程主要是:

用queue把函数加入队列(通常是函数数组)
用dequeue将函数数组中的第一个函数取出,并执行(用shift()方法取出并执行)
也就意味着当再次执行dequeue的时候,得到的是另一个函数了。同时也意味着,如果不执行dequeue,那么队列中的下一个函数永远不会执行。

对于一个元素上执行animate方法加动画,jQuery内部也会将其加入名为 fx 的函数队列。而对于多个元素要依次执行动画,则必须我们手动设置队列进行了。

一个例子,要两个div依次向左移动:

<div id="block1">div 1</div>
<div id="block2">div 2</div>
<script type="text/javascript">
 var FUNC=[
  function() {$("#block1").animate({color:"=blue"},aniCB);},
  function() {$("#block2").animate({color:"=red"},aniCB);},
  function() {$("#block1").animate({color:"=yellow"},aniCB);},
  function() {$("#block2").animate({color:"=grey"},aniCB);},
  function() {$("#block1").animate({color:"=green"},aniCB);},
  function(){alert("动画结束")}
 ];
 var aniCB=function() {
  $(document).dequeue("myAnimation");
 }
 $(document).queue("myAnimation",FUNC)
 //aniCB();
</script>

我首先建立了一个函数数组,里边是一些列需要依次执行的动画
然后我定义了一个回调函数,用dequeue方法用来执行队列中的下一个函数
接着把这个函数数组放到document上的myAnimation的队列中(可以选择任何元素,我只是为了方便而把这个队列放在document上)
最后我开始执行队列中的第一个函数
这样做的好处在于函数数组是线性展开,增减起来非常方便。而且,当不要要继续进行接下来动画的时候(比如用户点了某个按钮),只需要清空那个队列即可。而要增加更多则只需要加入队列即可。

//清空队列
$(document).queue("myAnimation",[]);
//加一个新的函数放在最后
$(document).queue(“myAnimation”,function(){alert("动画真的结束了!")});

这当然也可以用于ajax之类的方法,如果需要一系列ajax交互,每个ajax都希望在前一个结束之后开始,之前最原始的方法就是用回调函数,但这样太麻烦了。同样利用queue添加队列,每次ajax之后的回调中执行一次dequeue即可。

jQuery中动画animate的队列实现,下面用JavaScript模仿一个:

function Queue(){
 this.a = [];
 this.t = null;
}
Queue.prototype = {
 queue:function(s){
  var self = this;
  this.a.push(s);
  this.hold();
  return this;
 },
 hold:function(){
  var self = this;
  clearTimeout(this.t);
  this.t = setTimeout(function(){
   console.log("Queue start! ",self.a);
   self.dequeue();
  },0);
 },
 dequeue:function(){
  var s = this.a.shift(),self = this;
  if(s){
   console.log("s:"+s);
   setTimeout(function(){
    console.log("end:"+s);
    self.dequeue();
   },s);
  }
 }
};
var a = new Queue().queue(500).queue(200).queue(400).queue(1500).queue(300).queue(2000);
Javascript 相关文章推荐
ext实现完整的登录代码
Aug 08 Javascript
jquery tab插件制作实现代码
Jun 22 Javascript
jQuery 1.5最新版本的改进细节分析
Jan 19 Javascript
ToolTips JQEURY插件之简洁小提示框效果
Nov 19 Javascript
javascript检测对象中是否存在某个属性判断方法小结
May 19 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
Sep 01 Javascript
深入剖析javascript中的exec与match方法
May 18 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
vue-scroller记录滚动位置的示例代码
Jan 17 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
Sep 04 Javascript
vuex刷新后数据丢失的解决方法
Oct 18 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
Mar 25 #Javascript
jquery的each方法使用示例分享
Mar 25 #Javascript
提取jquery的ready()方法单独使用示例
Mar 25 #Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
Mar 25 #Javascript
jquery解析xml字符串示例分享
Mar 25 #Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 #Javascript
jquery选择器原理介绍($()使用方法)
Mar 25 #Javascript
You might like
19个超实用的PHP代码片段
2014/03/14 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
python requests证书问题解决
2019/09/05 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
网络安全方面的面试题
2016/01/07 面试题
医学院毕业生自荐信
2013/11/08 职场文书
酒店门卫岗位职责
2013/12/29 职场文书
毕业设计计划书
2014/01/09 职场文书
上班迟到检讨书
2014/01/10 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电