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插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
Oct 23 Javascript
javascript实现复选框选中属性
Mar 25 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
Sep 20 Javascript
jQuery实现Email邮箱地址自动补全功能代码
Nov 03 Javascript
从零学习node.js之express入门(六)
Feb 25 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
May 20 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
在vue组件中使用axios的方法
Mar 16 Javascript
koa+jwt实现token验证与刷新功能
May 30 Javascript
原生js+css调节音量滑块
Jan 15 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
Feb 11 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
玩转虚拟域名◎+ .
2006/10/09 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
使用Python生成随机密码的示例分享
2016/02/18 Python
Python全局变量用法实例分析
2016/07/19 Python
Python图算法实例分析
2016/08/13 Python
Python制作刷网页流量工具
2017/04/23 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
python实现音乐下载的统计
2018/06/20 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
基于Python函数和变量名解析
2019/07/19 Python
python实现飞行棋游戏
2020/02/05 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
初中物理教学反思
2014/01/14 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
端午节寄语2015
2015/03/23 职场文书