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实现点击后将文字或图片复制到剪贴板的方法
Aug 04 Javascript
scrollWidth,clientWidth,offsetWidth的区别
Jan 13 Javascript
嵌入式iframe子页面与父页面js通信的方法
Jan 20 Javascript
JavaScript原生对象之Number对象的属性和方法详解
Mar 13 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
Oct 25 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
Feb 09 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
webpack构建换肤功能的思路详解
Nov 27 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
Nov 30 Javascript
微信小程序文章详情功能完整实例
Jun 03 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的历史和优缺点
2006/10/09 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
PHP制作用户注册系统
2015/10/23 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
vue.js指令v-model使用方法
2017/03/20 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
优化Python代码使其加快作用域内的查找
2015/03/30 Python
python实现文件的备份流程详解
2019/06/18 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
linux下进程间通信的方式
2013/01/23 面试题
工商管理实习生自我鉴定范文
2013/12/18 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
岗位工作说明书
2014/07/29 职场文书
单位综合评价意见
2015/06/05 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js