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 相关文章推荐
Web层改进II-用xmlhttp 无声息提交复杂表单
Jan 22 Javascript
Save a File Using a File Save Dialog Box
Jun 18 Javascript
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
javascript 用原型继承来实现对象系统
Mar 22 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 Javascript
关于JavaScript的面向对象和继承有利新手学习
Jan 11 Javascript
Vue.Js中的$watch()方法总结
Mar 23 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
js 监控iframe URL的变化实例代码
Jul 12 Javascript
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
Vue 嵌套路由使用总结(推荐)
Jan 13 Javascript
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
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实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
php类的定义与继承用法实例
2015/07/07 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
JSON 数据格式详解
2017/09/13 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
python遍历文件夹下所有excel文件
2018/01/03 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
python利用tkinter实现屏保
2019/07/30 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
python实现PCA降维的示例详解
2020/02/24 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
python小白学习包管理器pip安装
2020/06/09 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
课外访万家心得体会
2014/09/03 职场文书
简历自荐信范文
2015/03/09 职场文书