jQuery1.9.1--queue队列源码分析(非动画部分)
jQuery.extend({
// 显示或操作在匹配元素上执行的函数队列
queue: function (elem, type, data) {
var queue;
if (elem) {
// type没定义的话就默认使用fxqueue
type = (type || 'fx') + 'queue';
// 先获取elem上的缓存数据
queue = jQuery._data(elem, type);
if (data) {
// 如果没有缓存数据或者data是数组
// 则给elem设置缓存数据
if (!queue || jQuery.isArray(data)) {
queue = jQuery._data(elem, type, jQuery.makeArray(data));
} else {
// 否则存在缓存数据数组直接入栈
queue.push(data);
}
}
return queue || [];
}
},
// 从队列最前端移除一个队列函数,并执行它
dequeue: function (elem, type) {
type = type || 'fx';
var
// 获取缓存队列
queue = jQuery.queue(elem, type),
startLength = queue.length,
// 取得队列的第一个元素
fn = queue.shift(),
// 钩子对象,如果获取不到缓存的钩子对象,就设置新的钩子对象并返回
hooks = jQuery._queueHooks(elem, type),
// 用来执行下一个队列
next = function () {
jQuery.dequeue(elem, type);
};
// 如果第一个元素是"inprogress",取下一个元素,长度相应减1
if (fn === 'inprogress') {
fn = queue.shift();
startLength--;
}
// 为钩子对象添加cur方法
hooks.cur = fn;
// 如果此时fn不为null || false || undefined
if (fn) {
// 如果type为“fx”,给队列添加"inprogress",防止自动出列(dequeue)
if (type === 'fx') {
queue.unshift('inprogress');
}
// 删除上一个队列的stop函数
delete hooks.stop;
// 执行fn函数,并且把下一个队列函数设置为fn的第一个参数
/*
可以这样使用:
$(document.body).queue('test', function(next){
console.log(11);
next();
});
$(document.body).queue('test', function(){
console.log(22);
});
$(document.body).dequeue('test');
*/
fn.call(elem, next, hooks);
}
// 如果队列长度为0且存在钩子对象,则删除缓存
if (!startLength && hooks) {
hooks.empty.fire();
}
},
// 私有方法,生成一个队列钩子对象(即从缓存数据中获取的队列钩子)
// 或者设置缓存队列钩子对象,这个对象的empty属性是一个Callbacks对象,这里的作用是删除缓存队列和缓存队列钩子的数据
_queueHooks: function (elem, type) {
var key = type + 'queueHooks';
return jQuery._data(elem, key) || jQuery._data(elem, key, {
empty: jQuery.Callbacks('once memory').add(function () {
jQuery._removeData(elem, type + 'queue');
jQuery._removeData(elem, key);
})
});
}
});
jQuery.fn.extend({
queue: function (type, data) {
var setter = 2;
if (typeof type !== 'string') {
data = type;
type = 'fx';
setter--;
}
/*
当满足这个条件的有以下几个情况:
1.没有参数
2.参数只有一个,且type是字符串
*/
if (arguments.length < setter) {
return jQuery.queue(this[0], type);
}
// 其他情况
return data === undefined ?
this :
this.each(function () {
var queue = jQuery.queue(this, type, data);
jQuery._queueHooks(this, type);
// 如果是动画队列且第一个元素不是"inprogres",
// 就出列并执行下一个元素
if (type === 'fx' && queue[0] !== 'inprogress') {
jQuery.dequeue(this, type);
}
});
},
dequeue: function (type) {
return this.each(function () {
jQuery.dequeue(this, type);
});
},
// TODO
delay: function (time, type) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || 'fx';
return this.queue(type, function (next, hooks) {
var timeout = setTimeout(next, time);
hooks.stop = function () {
clearTimeout(timeout);
};
});
},
clearQueue: function (type) {
return this.queue(type || 'fx', []);
},
promise: function (type, obj) {
var tmp,
count = 1,
defer = jQuery.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);
}
});
jQuery1.9.1--queue队列源码分析(非动画部分)的更多相关文章
- 细说并发5:Java 阻塞队列源码分析(下)
上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...
- 细说并发4:Java 阻塞队列源码分析(上)
上篇文章 趣谈并发3:线程池的使用与执行流程 中我们了解到,线程池中需要使用阻塞队列来保存待执行的任务.这篇文章我们来详细了解下 Java 中的阻塞队列究竟是什么. 读完你将了解: 什么是阻塞队列 七 ...
- Facebook Rebound 弹性动画库 源码分析
Rebound源码分析 让动画不再僵硬:Facebook Rebound Android动画库介绍一文中介绍了rebound这个库. 对于想体验一下rebound的效果,又懒得clone和编译代码的, ...
- Python 源码分析:queue 队列模块
起步 queue 模块提供适用于多线程编程的先进先出(FIFO)数据结构.因为它是线程安全的,所以多个线程很轻松地使用同一个实例. 源码分析 先从初始化的函数来看: 从这初始化函数能得到哪些信息呢?首 ...
- jQuery 源码分析(十一) 队列模块 Queue详解
队列是常用的数据结构之一,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).特点是先进先出,最先插入的元素最先被删除. 在jQuery内部,队列模块为动画模块提供基 ...
- laravel源码分析-队列Queue
laravel 源码分析具体注释见 https://github.com/FX-Max/source-analysis-laravel 前言 队列 (Queue) 是 laravel 中比较常用的一个 ...
- jQuery源码分析系列(39) : 动画队列
data函数在jQuery中只有短短的300行代码,非常不起点 ,剖析源码的时候你会发现jQuery只要在有需要保存数据的地方无时无刻不依赖这个基础设施 动画会调用队列,队列会调用data数据接口还保 ...
- jQuery-1.9.1源码分析系列(十五) 动画处理——外篇
a.动画兼容Tween.propHooks Tween.propHooks提供特殊情况下设置.获取css特征值的方法,结构如下 Tween.propHooks = { _default: { get: ...
- jQuery1.6源码分析系列
原文地址:http://www.cnblogs.com/nuysoft/archive/2011/11/14/2248023.html jQuery源码分析(版本1.6.1) 目录 00 前言开光 0 ...
随机推荐
- Oracle 11g 执行计划管理1
1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而 ...
- 共享内存shared pool (5):详解一条SQL在library cache中解析
前面介绍的 shared pool,library cache结构,都是为了说明一条SQL是如何被解析的.先看下面的图: 图中涉及的各结构简单介绍 父HANDLE,里面有父游标堆0的地址.. 父游标堆 ...
- JLINK V8 Keil MDK4.10 STM32
新买的JLINK v8仿真器,第一次使用,编译环境是Keil MDK4.10,目前芯片是STM32F103x. 按照光盘的说明先安装了驱动,USB接上JLINK v8,显示驱动成功.但是在debug或 ...
- 在WPF中显示GIF图片并实现循环播放
WPF中有一个MediaElement媒体控件,可以来播放媒体,同时也可以显示GIF图片.但看到网上有些人说用MediaElement不能加载作为资源或内嵌的资源的GIF图片,我猜他们一定是在前台用X ...
- android开发图片分辨率问题解决方案
dpi是什么呢? dpi是“dot per inch”的缩写,每英寸像素数. 四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (ex ...
- python 安装scrapy
1. 首先你先得安装PYTHON...还是推荐2.7吧,之前装了3.3似乎和这个世界格格不入...先装个2.7. 并将python加入系统的环境变量. 2. 去scrapy 官网下载最新版本的scra ...
- < java.lang >-- StringBuffer字符串缓冲区
构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符. 特点: 1:可以对字符串内容进行修改. 2:是一个容器. 3:是可变长度的. 4:缓冲区中可以存储任意类型的数据. 5:最终需要变成字符 ...
- C++中复制构造函数与重载赋值操作符总结
前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...
- 基于PBOC电子钱包的消费过程详解
智能卡金融行业应用电子钱包的消费交易流程,开发人员可参考 首先终端和卡片有一个共同的密钥叫做消费密钥:PurchKey (针对每种特定的交易,比如,圈存,消费,都有特定的密钥与之对应) 假设Purch ...
- CoffeeRobotTeam项目组报告
一.小组分工 模块 任务 责任人 备注 报告 需求分析 熊振威 功能分析 熊振威 项目报告 熊振威 人机界面 秦勤.洪超 单元测试 姜进.张文强 机器人代码 机器人类 徐意.余拥军.孙智博 机器人运动 ...