jQuery队列操作方法实例


Posted in Javascript onJune 11, 2014

jQuery核心中, 有一组队列控制方法, 这组方法由queue()/dequeue()/clearQueue()三个方法组成, 它对需要连续按序执行的函数的控制可以说是简明自如, 主要应用于animate ()方法, ajax以及其他要按时间顺序执行的事件中.

先解释一下这组方法各自的含义.

queue(name,[callback]): 当只传入一个参数时, 它返回并指向第一个匹配元素的队列(将是一个函数数组,队列名默认是fx); 当有两个参数传入时, 第一个参数还是默认为fx的的队列名, 第二个参数又分两种情况, 当第二个参数是一个函数时, 它将在匹配的元素的队列最后添加一个函数. 当第二个参数是一个函数数组时,它将匹配元素的队列用新的一个队列来代替(函数数组).可能, 这个理解起来有点晕.

dequeue(name): 这个好理解, 就是从队列最前端移除一个队列函数, 并执行它.

clearQueue([queueName]):这是1.4新增的方法. 清空对象上尚未执行的所有队列. 参数可选,默认为fx. 但个人觉得这个方法没多大用, 用queue()方法传入两个参数的第二种参数即可实现clearQueue方法.

现在, 我们要实现这样一个效果, 有标有1至7的数字方块, 要求这七个方块自左到右依次下落. 查看DEMO
css与html部分我就不贴出来了, DEMO中有. 若按常规做法, 可能需要用如下jQ代码来实现:

$('.one').delay(500).animate({
    top: '+=270px'
},
500,
function() {
    $('.two').delay(500).animate({
        top: '+=270px'
    },
    500,
    function() {
        $('.three').delay(500).animate({
            top: '+=270px'
        },
        500,
        function() {
            $('.four').delay(500).animate({
                top: '+=270px'
            },
            500,
            function() {
                $('.five').delay(500).animate({
                    top: '+=270px'
                },
                500,
                function() {
                    $('.six').delay(500).animate({
                        top: '+=270px'
                    },
                    500,
                    function() {
                        $('.seven').animate({
                            top: '+=270px'
                        },
                        500,
                        function() {
                            alert('按序落体运动结束! Yeah!')
                        });
                    });
                });
            });
        });
    });
});

嗯, 没错, 效果很完美的呈现给出来了, 但这种晕眩的代码, 你能忍受吗? 即便可以忍受, 如果此时, 你想调换一个某个的执行顺序, 比如, 你想让5落下后再开始下落3, 或者新加8至15八个方块, 怎么办? 重写吗? 在里面小心冀冀的改吗? 显然, 我们需要另外一种列简明便捷的方法来实现这个效果, 那就是jQuery队列控制方法.请看如下代码:

var _slideFun = [function() {
    $('.one').delay(500).animate({
        top: '+=270px'
    },
    500, _takeOne);
},
function() {
    $('.two').delay(300).animate({
        top: '+=270px'
    },
    500, _takeOne);
},
function() {
    $('.three').delay(300).animate({
        top: '+=270px'
    },
    500, _takeOne);
},
function() {
    $('.four').delay(300).animate({
        top: '+=270px'
    },
    500, _takeOne);
},
function() {
    $('.five').delay(300).animate({
        top: '+=270px'
    },
    500, _takeOne);
},
function() {
    $('.six').delay(300).animate({
        top: '+=270px'
    },
    500, _takeOne);
},
function() {
    $('.seven').delay(300).animate({
        top: '+=270px'
    },
    500,
    function() {
        alert('按序落体运动结束! Yeah!');
    });
}];
$('#demo').queue('slideList', _slideFun);
var _takeOne = function() {
    $('#demo').dequeue('slideList');
};
_takeOne();

这样一来, 看起来是不是简明多了. 如何实现?
1. 新建一个数组,把动画函数依次放进去(这样更改顺序,新加动画是不是方便多了?);
2. 用queue将这组动画函数数组加入到slideList队列中;
3. 用dequeue取出slideList队列中第一个函数, 并执行它;
4. 初始执行第一个函数.

至于clearQueue()方法,就不多说了, 演示中停止按钮调用的就是clearQueue()方法,当然你还可以用queue()方法直接将现在的函数列队替换成[]空数组实现(个人比较推荐空数组替换.,更直观).

Javascript 相关文章推荐
xmlhttp缓存清除的2种解决方法
Dec 13 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
Jan 08 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
在JavaScript中模拟类(class)及类的继承关系
May 20 Javascript
简单实现js间歇或无缝滚动效果
Jun 29 Javascript
Vue关于数据绑定出错解决办法
May 15 Javascript
利用nginx + node在阿里云部署https的步骤详解
Dec 19 Javascript
浅谈gulp创建完整的项目流程
Dec 20 Javascript
JS中的BOM应用
Feb 02 Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
Apr 29 Javascript
JS生成不重复随机数组的函数代码
Jun 10 #Javascript
JS 在指定数组中随机取出N个不重复的数据
Jun 10 #Javascript
JS生成随机字符串的多种方法
Jun 10 #Javascript
json中换行符的处理方法示例介绍
Jun 10 #Javascript
Jquery焦点与失去焦点示例应用
Jun 10 #Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
Jun 10 #Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
Jun 10 #Javascript
You might like
ie6 动态缩略图不显示的原因
2009/06/21 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
利用JS实现数字增长
2016/07/28 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
培训讲师邀请函
2014/01/10 职场文书
白血病募捐倡议书
2014/05/14 职场文书
公司授权委托书
2014/10/17 职场文书
五年级学生评语大全
2014/12/26 职场文书
上课说话检讨书
2015/01/27 职场文书
通用员工手册范本
2015/05/14 职场文书
请客吃饭开场白
2015/06/01 职场文书
学校运动会通讯稿
2015/07/18 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android