国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

jQuery 源碼分析筆記(7) Queue

2019-11-20 23:47:41
字體:
來源:轉載
供稿:網友
每個Element可以擁有多個隊列,但是基本上都只使用到一個,即默認的fn隊列。隊列允許一系列函數被異步地調用而不會阻塞程序。例如:$("#foo").slideUp().fadeIn();其實這個就是我們大家常用的鏈式調用,實際上這是一個Queue。所以隊列和Deferred地位類似,是一個內部使用的基礎設施。當slideUp運行時,fadeIn被放到fx隊列中,當slideUp完成后,從隊列中被取出運行。queue函數允許直接操作這個鏈式調用的行為。同時,queue可以指定隊列名稱獲得其他能力,而不局限于fx隊列。
復制代碼 代碼如下:

// 一般用法:
$("#foo").slideUp(function() {
alert("Animation complete.");
});
// 相當于:
$("#foo").slideUp(); // 不提供回調,只是觸發事件
$("#foo").queue(function() { // 把回調函數加入
alert("Animation complete.");
$(this).dequeue(); // 必須從隊列中取出,那么隊列中的下一個函數就有機會被調用
});

queue內部使用data或者JavaScript數組API來保存數據。其中操作數組的push和shift天生就是一組隊列API。而data可以用來保存任意數據。
復制代碼 代碼如下:

queue: function(elem, type, data) {
if(elem) {
// 默認是fn
type = (type || "fx") + "queue";
// data內部API:data(element, key, value, pvt);
// 這里不傳入data,是為了效率的考慮。如果沒傳入data,則只是get隊列,那么就不需要以下的判斷了
var q = jQuery.data(elem, type, undefined, true);
if(data) {
if(!q || jQuery.isArray(data)) {
q = jQuery.data(elem, type, jQuery.makeArray(data), true);
} else {
q.push(data); // 壓入
}
}
return q || [];
}
}
dequeue: function(elem, type) { type = type || "fx"; // 得到這個隊列 var queue = jQuery.queue(elem, type), // 出列一個元素 fn = queue.shift(), defer;
// "inprogress"崗哨
if(fn === "inprogress") {
fn = queue.shift();
}
if(fn) {
// 加一個崗哨,防止自動出列
if(type === "fx") {
queue.unshift("inprogress");
}
// 執行
fn.call(elem, function() {
jQuery.dequeue(elem, type);
});
}
if(!queue.length) {
jQuery.removeData(elem, type + "queue", true);
handleQueueMarkDefer(elem, type, "queue");
}
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 且末县| 攀枝花市| 东阳市| 扶风县| 松阳县| 乐都县| 南安市| 东乌珠穆沁旗| 突泉县| 错那县| 沧源| 丰城市| 通山县| 清丰县| 沐川县| 全州县| 德格县| 额敏县| 新密市| 崇文区| 黎城县| 项城市| 北辰区| 仪征市| 阜阳市| 安岳县| 临猗县| 台安县| 屏南县| 阆中市| 林州市| 南通市| 延吉市| 资兴市| 进贤县| 墨脱县| 乐亭县| 兴国县| 西平县| 泰顺县| 星子县|