###jquery.data
[data模組](是乙個比較有趣的功能,可以為任意的element
新增額外的資料。而且處理了迴圈引用和記憶體洩漏的問題。
api非常簡單,就是.data(key, value)用來儲存,.data(key)用開查詢資料。
data部分的**從1381行開始。最開始的幾行關鍵**:
jquery.extend(,對外的介面都呼叫了兩個內部函式:jquery.data(elem, name, data, pvt)和jquery.removedata(elem, name, pvt)。// 分配id用的seed
uuid: 0,
// 為了區別不同的jquery例項儲存的資料,使用字首+jquery版本號+隨機數作為key
expando: "jquery" + (jquery.fn.jquery + math.random()).replace(/\d/g, ""),
nodata:
});
而removedata的邏輯與data類似,只是data是加入資料,而removedata使用delete或者設定為null刪除資料。
data部分的**中明確區分了js物件和dom物件的儲存,這是為了解決部分瀏覽器的記憶體洩漏問題。
在低版本ie中,當dom和js物件之間出現迴圈引用時,gc就無法正確處理。參見[understanding and solving internet explorer leak patterns](
至於com物件,因為已經限制object元素沒有data,就繞過了這個問題。
data: function(elem, name, data, pvt)var internalkey = jquery.expando,
getbyname = typeof name === "string",
thiscache,
isnode = elem.nodetype,
// dom元素需要儲存在cache,js物件直接儲存到elem
cache = isnode ? jquery.cache : elem,
// 如果elem的jquery.expando已經有值了,就重用
id = isnode ? elem[jquery.expando] : elem[jquery.expando] && jquery.expando;
// data未定義,說明當前呼叫是查詢資料,但是物件沒有任何資料,直接返回
if((!id || (pvt && id && !cache[id][internalkey])) && getbyname && data === undefined)
if(!id) else
}// 清空原來的值
if(!cache[id]) ;
if(!isnode)
}// 用extend擴充套件cache,增加乙個屬性,用來儲存資料
if(typeof name === "object" || typeof name === "function") else
}thiscache = cahce[id];
// 避免key衝突
if(pvt) ;
}thiscache = thiscache[internalkey];
}if(data !== undefined)
return getbyname ? thiscache[jquery.camelcase(name)] : thiscache;
}removedata: function( elem, name, pvt ) else
var internalcache = cache[ id ][ internalkey ];
// 如果還有資料,就清空一次再設定,增加效能
if ( internalcache ) ;
cache[ id ][ internalkey ] = internalcache;
// 已經沒有任何資料了,就全部刪除
} else if ( isnode ) else if ( elem.removeattribute ) else
}}
jQuery 原始碼分析筆記 3
deferred機制 從1.5版本開始,jquery加入了deferred功能,讓事件處理佇列更加的完善。並用 這個機制重寫了ajax模組。雖然還沒輪到ajax,但是接下來的事件處理函式中牽扯到了 這個機制,所以提前看這段 deferred把 函式註冊到乙個佇列中,統一管理,並且可以同步或者非同步地...
jQuery原始碼分析
工具 版本說明 版本號備註 jquery 2.1.1 sublime 3jquery function selector,context jquery.fn jquery.prototype 快速匹配正則 不加g 不光匹配整體項還會匹配到子項 rquickexpr s w w w init jque...
jQuery原始碼分析
一 jquery如何做到不汙染變數名並暴露出 供使用者使用 jquery將變數和 寫進立即執行函式,通過函式來包裹所有的變數和方法,再在這個立即執行函式上將 jquery方法繫結到window上,就可以讓使用者使用到jq方法了。二 jquery是如何做到 jquery 的?function wind...