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 相关文章推荐
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
js判断设备是否为PC并调整图片大小
Feb 12 Javascript
使用jQuery时Form表单元素ID和name命名大忌
Mar 06 Javascript
技术男用来对妹子表白的百度首页
Jul 23 Javascript
JavaScript设置body高度为浏览器高度的方法
Feb 09 Javascript
javascript中的正则表达式使用详解
Aug 30 Javascript
JavaScript事件详细讲解
Jun 27 Javascript
AngularJS 服务详细讲解及示例代码
Aug 17 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
Jul 13 Javascript
浅谈js中的attributes和Attribute的用法与区别
Jul 16 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 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
PHP 数组遍历顺序理解
2009/09/09 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
Python 性能优化技巧总结
2016/11/01 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
关于python写入文件自动换行的问题
2018/06/23 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Python-接口开发入门解析
2019/08/01 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
Django model class Meta原理解析
2020/11/14 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
就业推荐自我鉴定
2013/10/06 职场文书
行政助理岗位职责范文
2013/12/03 职场文书
情人节活动策划方案
2014/02/27 职场文书
小学班主任寄语大全
2014/04/04 职场文书
化工专业求职信
2014/07/01 职场文书
小学领导班子对照材料
2014/08/23 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
雨花台导游词
2015/02/06 职场文书