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 相关文章推荐
23个超流行的jQuery相册插件整理分享
Apr 25 Javascript
基于JQuery制作可编辑的表格特效
Dec 23 Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
Aug 31 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
DOM 事件的深入浅出(二)
Dec 05 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
Jan 06 Javascript
详解如何去除vue项目中的#——History模式
Oct 13 Javascript
js实现随机点名系统(实例讲解)
Oct 18 Javascript
Node.js实现发送邮件功能
Nov 06 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
Aug 10 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伪造referer实例代码
2008/09/20 PHP
PHP原理之异常机制深入分析
2010/08/08 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
一年级班主任寄语
2014/01/19 职场文书
技校个人求职信范文
2014/01/25 职场文书
会议室使用管理制度
2015/08/06 职场文书
react antd实现动态增减表单
2021/06/03 Javascript
MySQL 逻辑备份 into outfile
2022/05/15 MySQL
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers