jQuery队列操作
jQuery.queue
1、"fx"是什么?
队列动画的默认名称
队列的名字为type + "queue",默认是"fxqueue"
2、队列存储于内部jQuery._data的内部数据上
3、如果传递了数据,则直接合并到现有的数据里面
4、最后返回了一个数组
jQuery.dequeue
1、会推出队列的第一个函数,以便后面进行执行
2、同时会用当前的type名称存储一个hooks,作为最后清理data的函数,并作为每次执行时的第三个参数,这里不明白的是为什么要用Callbacks,是出于什么考虑呢?
3、并保存一个函数next,里面是出队下一函数的执行逻辑,作为执行时的第二个函数,jquery在函数执行时传入next和hooks是出于什么考虑?
4、如果是默认的fx队列,则需要再出队一次,并把开始位置减一
5、如果有出队函数,并且为fx队列,则推入"inprogress"字符串,来防止fx队列被自动出队(这里没看懂),这里折腾这一步是为了什么
6、然后删除hooks的stop函数,这里也没看懂。。。,hooks是Callback对象,哪里来的stop函数?
7、长度为0以后,调用hooks的fire函数做最后的清理
jQuery._queueHooks
1、key = type + "queueHooks";
2、如果有key对应的数据,则直接返回
如果没有,则存入一个对象
{
"empty": 一个Callback对象,会把key和type对应的数据全部删除
}
.queue
1、第一步根据type的类型来修正type的名称,如果不是字符串,则自动修复成fx
2、如果只传入了type,则直接返回$.queue定义队列
3、如果传入了空字符串,并传入了null的data,则直接把元素返回
4、如果传入的type不是字符串,则把data修正为type
5、如果传入了符合规则的type和data,则遍历元素,把每一个元素都入队对应的type和data
6、并保证每个元素都有一个hooks,这里没看懂,这么做是为什么?
7、如果为fx队列,并且为inprogress,则直接出队
.dequeue
就是遍历元素调用jQuery.dequeue方法
.promise
这是一个队列观察者函数,它监听着每个匹配元素的某一类型的队列的完成情况
<div class="wrapper">
<img src="./img/side1.jpg" />
</div>
<script>
!function($){
var img = $("img"); img.queue("test", function(){
console.log(1);
}); img.dequeue("test");
//img.dequeue("test"); img.promise("test").done( function () {
console.log("success");//这里不会输出 success,再把上面的注释去掉试试吧~
});
}(jQuery);
</script>
造成这个的原因,是因为 promise 源码中的计数器是从1开始的,为什么这么设计呢?我也不知道。。。
不过从这里和之前的代码也可以看出,queue 的这一部分主要是为 jQuery 的动画服务的,它的很多逻辑都是与 jQuery 的动画逻辑耦合的,所以 queue 这一部分其实并不适合我们在业务逻辑中单独使用
.promise()源码片段:
// Get a promise resolved when queues of a certain type
// are emptied (fx is the type by default)
promise: function( type, obj ) {
var tmp,
count = 1,//计数器从1开始
defer = jQuery.Deferred(),//新的deferred对象
elements = this,//当前的元素
i = this.length,
resolve = function() {
if ( !( --count ) ) {
defer.resolveWith( elements, [ elements ] );
}
}; if ( typeof type !== "string" ) {
obj = type;
type = undefined;
}
type = type || "fx";//这里的处理逻辑与前面是一样的 while ( i-- ) {
tmp = jQuery._data( elements[ i ], type + "queueHooks" );
if ( tmp && tmp.empty ) {
count++;
tmp.empty.add( resolve );
}
}
resolve();
return defer.promise( obj );//合并传入进来的对象
}
deferred.promise()相关的片段
// Get a promise for this deferred
// If obj is provided, the promise aspect is added to the object
promise: function( obj ) {
return obj != null ? jQuery.extend( obj, promise ) : promise;
}
再看一个 jQuery 官网给的例子
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>promise demo</title>
<style>
div {
height: 50px;
width: 50px;
float: left;
margin-right: 10px;
display: none;
background-color: #090;
}
</style>
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body> <button>Go</button>
<p>Ready...</p>
<div></div>
<div></div>
<div></div>
<div></div> <script>
$( "button" ).on( "click", function() {
$( "p" ).append( "Started..." ); $( "div" ).each(function( i ) {
$( this ).fadeIn().fadeOut( 1000 * ( i + 1 ) );
}); $( "div" ).promise().done(function() {
$( "p" ).append( " Finished! " );
});
});
</script> </body>
</html>
结果展示:http://jsfiddle.net/oh6e0uk3/
jQuery队列操作的更多相关文章
- jquery源码解析:jQuery队列操作queue方法实现的原理
我们先来看一下jQuery中有关队列操作的方法集: 从上图可以看出,既有静态方法,又有实例方法.queue方法,相当于数组中的push操作.dequeue相当于数组的shift操作.举个例子: fun ...
- jQuery源码分析系列(38) : 队列操作
Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Qu ...
- jQuery源代码学习之八——jQuery属性操作模块
一.jQuery属性模块整体介绍 jQuery的属性操作模块分四个部分:html属性操作,dom属性操作,类样式操作,和值操作. html属性操作(setAttribute/getAttribute) ...
- Jq_Ajax 操作函数跟JQuery 遍历函数跟JQuery数据操作函数
JQuery文档操作方法 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- IE7中使用Jquery动态操作name问题
问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就 ...
- 深入学习jQuery节点操作
× 目录 [1]创建节点 [2]插入节点 [3]删除节点[4]复制节点[5]替换节点[6]包裹节点 前面的话 DOM节点操作包括创建节点.插入节点.移除节点.替换节点和复制节点.jQuery也有类似的 ...
- JQuery中操作Css样式的方法
JQuery中操作Css样式的方法//1.获取和设置样式 $("#tow").attr("class")获取ID为tow的class属性 $("#tw ...
- LabVIEW之生产者/消费者模式--队列操作 彭会锋
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
随机推荐
- c#操作xml文件(XmlDocument,XmlTextReader,Linq To Xml)
主界面
- MySQL Cluster搭建与测试
MySQL Cluster是一个基于NDB Cluster存储引擎的完整的分布式数据库系统.不仅仅具有高可用性,而且可以自动切分数据,冗余数据等高级功能.和Oracle Real Cluster Ap ...
- Java Service Wrapper简介与使用
在实际开发过程中很多模块需要独立运行,他们并不会以web形式发布,传统的做法是将其压缩为jar包独立运行,这种形式简单易行也比较利于维护,但是一旦服务器重启或出现异常时,程序往往无法自行修复或重启.解 ...
- Codeforces Round #384 (Div. 2) ABCD
一场比较简单的div2 电脑出了点问题 所以在比赛中理论ac了ACD 除了爆int这种事情之外.. A 一个人想从a到b 移动的花费这么定义 如果初始点和到达点类型相同 就不花钱 反之花距离差的绝对值 ...
- Python强化训练笔记(六)——让字典保持有序性
python的字典是一个非常方便的数据结构,使用它我们可以轻易的根据姓名(键)来找到他的成绩,排名等(值),而不用去遍历整个数据集. 例如:{'Lee': [1, 100], 'Jane': [2, ...
- surface pro 4 wifi掉线问题
更新你的无线网卡驱动到最新版本15.68.9032.47,重启.或者运行regedit修改注册表 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\mr ...
- window的对象有哪些(笔记)
window的主对象主要有如下几个: document 对象: frames 对象: history 对象: location 对象: navigator 对象: screen 对象: 全局变量和函数 ...
- 弱网测试Android
弱网测试一般是指模拟在网络环境比较差的情况下,检测APP是否有异常,如崩溃,数据收发出现丢包的情况 一.首先需要控制网络,有两种方式其一使用网络损伤仪进行,其二采用软件方式.硬件采购费用太贵,因此使用 ...
- asp.net中http提交数据所遇到的那些坑
http提交数据有两种形式,get和post,不知道的同学请联系度娘. 1.aspnet:MaxHttpCollectionKeys 业务场景:业务很简单,手机端读取本地通讯录,将所有通讯录提交到后台 ...
- 手机app开发:浅谈APP登录方式的优劣
手机app开发公司亿合科技要是给你一个机会设计一款APP,你会用什么方式做这个APP的登录模块?根据APP的业务模型的不同会有不同的设计方法.如果是偏内容型的APP,需要优先展示内容给用户,当用户需要 ...