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官方 jQuery1.1.3发布,速度提升800%,体积保持20K
Aug 19 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
Oct 16 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
Oct 17 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
May 16 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
Jun 20 Javascript
js从外部获取图片的实现方法
Aug 05 Javascript
在点击div中的p时,如何阻止事件冒泡
Feb 07 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
Aug 23 Javascript
基于JS实现html中placeholder属性提示文字效果示例
Apr 19 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
Jun 08 Javascript
TypeScript开发Node.js程序的方法
Apr 30 Javascript
vuex中store存储store.commit和store.dispatch的用法
Jul 24 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版)
2012/08/21 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
yii添删改查实例
2015/11/16 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
Python简单遍历字典及删除元素的方法
2016/09/18 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
校园活动策划方案
2014/06/13 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python