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 相关文章推荐
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
May 15 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
Jul 04 Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 Javascript
JavaScript判断数组是否包含指定元素的方法
Jul 01 Javascript
深入解析JavaScript中的立即执行函数
May 21 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
Angular中$broadcast和$emit的使用方法详解
May 22 Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
Aug 27 jQuery
Vue绑定用户接口实现代码示例
Nov 04 Javascript
关于小程序优化的一些建议(小结)
Dec 10 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
队列在编程中的实际应用(php)
2010/09/04 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
百度地图API使用方法详解
2015/08/25 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
python 生成图形验证码的方法示例
2018/11/11 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
Python 爬虫的原理
2020/07/30 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
六五普法心得体会2016
2016/01/21 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
2019广播稿怎么写
2019/04/17 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL