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 相关文章推荐
js限制文本框为整数和货币的函数代码
Oct 13 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
Js数组排序函数sort()介绍
Jun 08 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
Sep 18 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
Aug 10 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
Jul 10 Javascript
JS中跳出循环的示例代码
Sep 14 Javascript
原生JS上传大文件显示进度条 php上传文件代码
Mar 27 Javascript
JS正则表达式封装与使用操作示例
May 15 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
JS前端广告拦截实现原理解析
Feb 17 Javascript
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
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
详解如何在云服务器上部署Laravel
2017/06/30 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
javascript 弹出层组件(升级版)
2011/05/12 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
jquery获取radio值实例
2014/10/16 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
Django在win10下的安装并创建工程
2017/11/20 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
如何通过Python实现标签云算法
2019/07/02 Python
手写一个python迭代器过程详解
2019/08/27 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
个人欠款担保书
2014/05/20 职场文书
社区反邪教工作方案
2014/06/16 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
计划生育汇报材料
2014/12/26 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
图书馆义工感想
2015/08/07 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
Python中使用ipython的详细教程
2021/06/22 Python