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

首頁 > 編程 > JavaScript > 正文

jQuery 源碼分析筆記(4) Ready函數

2019-11-20 23:48:02
字體:
來源:轉載
供稿:網友
這個功能在 jQuery的文檔中提到了三種等價的形式:
復制代碼 代碼如下:

// 定義在jQuery.fn.ready
$(document).ready(handler);
// 和上一個是同一個,不推薦
$().ready(handler);
// 單獨在jQuery對象中處理
$(handler);
// 以上這個形式的定義:
if(jQuery.isFunction(selector) {
return rootjQuery.ready(selector);
}

因此實際上都歸結與一個形式:jQuery.fn.ready(fn)。定義如下:
復制代碼 代碼如下:

ready: function(fn) {
// 綁定事件到DOM上
jQuery.bindReady();
// 觸發回調函數
readyList.done(fn);
// 返回jQuery對象
return this;
}

實際上jQuery內部并不僅僅只有一個對fn的引用。這里用到了 Deferred功能。在75行,為jQuery對象定義了readyList成員。而在442行在bindReady函數中初始化了這個變量:
復制代碼 代碼如下:

if(readyList) {
return;
}
readyList = jQuery._Deferred();

bindReady函數除了初始化readyList之外,主要處理了瀏覽器對于綁定事件的區別。IE使用attachEvent而其他瀏覽器使用addEventHandler。這兩個步驟完成后,ready函數使用readyList.resolveWith 觸發回調函數。除了這個工作外,ready還處理了holdReady。這個API 的作用是延遲ready事件的回調,主要目的是在ready事件前做點事情。holdReady設置了一個標志位readyWait。當這個標志位被設置之后,ready在調用readyList.resolveWith之前不停地調用setTimeout(jQuery.ready, 1)。即每隔固定時間就遞歸調用自己(不知道hold時間久了,js引擎會不會棧溢出),這樣最后被holdReady釋放的時候, setTimeout會沿著調用棧回來的。為了在這個棧完成之前不觸發ready回調函數。在每次調用setTimeout的時候,會遞增readyWait變量。用來指示被holdReady函數延誤了幾次調用。


###幾個基礎輔助函數
在543行開始,定義了幾個值得注意的輔助函數:parseJSON,parseXML和globalEval。parseJSON把一個字符串變成JSON對象。我們一般使用的是eval。parseJSON封裝了這個操作,但是eval被當作了最后手段。因為最新JavaScript標準中加入了JSON序列化和反序列化的API。如果瀏覽器支持這個標準,則這兩個API是在JS引擎中用Native Code實現的,效率肯定比eval高很多。目前來看,Chrome和Firefox4都支持這個API。parseJSON使用如下:
復制代碼 代碼如下:

// 原生JSON API。反序列化是JSON.stringify(object)
if(window.JSON && window.JSON.parse) {
return window.JSON.parse(data);
}
// ... 大致地檢查一下字符串合法性
return (new Function("return " + data))();

parseXML函數也主要是標準API和IE的封裝。標準API是DOMParser對象。而IE使用的是Microsoft.XMLDOM的 ActiveXObject對象。定義:
復制代碼 代碼如下:

if(window.DOMParser) {
tmp = new DOMParser();
xml = tmp.parseFromString(data, "text/xml");
} else {
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = "false";
xml.loadXML(data);
}

globalEval函數把一段腳本加載到全局context中。IE中可以使用window.execScript。其他瀏覽器需要使用eval。因為整個jQuery代碼都是一整個匿名函數,所以當前context是jQuery。主要代碼:
復制代碼 代碼如下:

(window.execScript || function(data) {
window["eval"].call(window, data); // 在window context下運行
})(data);
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临猗县| 南投县| 乌拉特前旗| 文成县| 虹口区| 抚顺市| 铜陵市| 长宁区| 容城县| 同德县| 巴里| 信宜市| 布尔津县| 当涂县| 平罗县| 曲阳县| 博湖县| 大足县| 公主岭市| 怀来县| 漳平市| 九寨沟县| 衡阳县| 济源市| 阿鲁科尔沁旗| 隆安县| 邯郸市| 西乌珠穆沁旗| 崇州市| 张家口市| 阿克陶县| 凤台县| 瑞丽市| 林周县| 武夷山市| 班戈县| 特克斯县| 兰坪| 浑源县| 浑源县| 读书|