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 相关文章推荐
document.onreadystatechange事件的用法分析
Oct 17 Javascript
详细谈谈javascript的对象
Jul 31 Javascript
JS实现重新加载当前页面
Nov 29 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
JavaScript中的编码和解码函数
Feb 15 Javascript
从零学习node.js之详解异步控制工具async(八)
Feb 27 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 Javascript
axios对请求各种异常情况处理的封装方法
Sep 25 Javascript
Vue.js特性Scoped Slots的浅析
Feb 20 Javascript
Vue数据绑定实例写法
Aug 06 Javascript
利用JavaScript写一个简单计算器
Nov 27 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
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
跟老齐学Python之for循环语句
2014/10/02 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
深入理解Python中变量赋值的问题
2017/01/12 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
.net面试题
2015/12/22 面试题
编辑找工作求职信分享
2014/01/03 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
Python anaconda安装库命令详解
2021/10/16 Python