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 相关文章推荐
jquery Firefox3.5中操作select的问题
Jul 10 Javascript
jQuery滚动加载图片效果的实现
Mar 06 Javascript
jquery制作搜狐快站页面效果示例分享
Feb 21 Javascript
jQuery中:hidden选择器用法实例
Dec 30 Javascript
javascript实现复选框超过限制即弹出警告框的方法
Feb 25 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
AngularJS创建自定义指令的方法详解
Nov 03 Javascript
使用JavaScript实现表格编辑器(实例讲解)
Aug 02 Javascript
js经验分享 JavaScript反调试技巧
Mar 10 Javascript
详解微信UnionID作用
May 15 Javascript
微信小程序canvas开发水果老虎机的思路详解
Feb 07 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
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
彻底理解Python list切片原理
2017/10/27 Python
python实现kNN算法
2017/12/20 Python
单利模式及python实现方式详解
2018/03/20 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
python的faker库用法
2019/11/28 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
Python通过format函数格式化显示值
2020/10/17 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
大学班长的职责
2014/01/27 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
实习单位鉴定评语
2014/04/26 职场文书
担保书范本
2015/01/20 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers