jQuery從1.2.3版本引入數(shù)據(jù)緩存系統(tǒng),主要的原因就是早期的事件系統(tǒng) Dean Edwards 的 ddEvent.js代碼帶來的問題:
1.沒有一個系統(tǒng)的緩存機制,它把事件的回調(diào)都放到EventTarget之上,這會引發(fā)循環(huán)引用 2.如果EventTarget是window對象,又會引發(fā)全局污染不同模塊之間用不同緩存變量
一般jQuery開發(fā),我們都喜歡便捷式的把很多屬性,比如狀態(tài)標(biāo)志都寫到dom節(jié)點中,也就是HTMLElement。
好處 :
直觀,便捷。
壞處 :
1.循環(huán)引用 2.直接暴露數(shù)據(jù),安全性? 3.增加一堆的自定義屬性標(biāo)簽,對瀏覽器來說是沒意的 4.取數(shù)據(jù)的時候要對HTML節(jié)點做操作
jQuery緩存系統(tǒng)的真正魅力在于其內(nèi)部應(yīng)用中,動畫、事件等都有用到這個緩存系統(tǒng)。試想如果動畫的隊列都存儲到各DOM元素的自定義屬性中,這樣雖然可以方便的訪問隊列數(shù)據(jù),但也同時帶來了隱患。如果給DOM元素添加自定義的屬性和過多的數(shù)據(jù)可能會引起內(nèi)存泄漏,所以要盡量避免這么干。
A.允許我們在DOM元素上附加任意類型的數(shù)據(jù),避免了循環(huán)引用的內(nèi)存泄漏風(fēng)險 B.用于存儲跟dom節(jié)點相關(guān)的數(shù)據(jù),包括事件,動畫等 C.一種低耦合的方式讓DOM和緩存數(shù)據(jù)能夠聯(lián)系起來
對于jQuery來說,數(shù)據(jù)緩存系統(tǒng)本來就是為事件系統(tǒng)服務(wù)而分化出來的,到后來,它的事件克隆乃至后來的動畫列隊實現(xiàn)數(shù)據(jù)的存儲都是離不開緩存系統(tǒng),所以數(shù)據(jù)緩存也算是jQuery的一個核心基礎(chǔ)了。
jQuery的數(shù)據(jù)緩存接口:
jQuery.data( element, key, value ) .data( )
對于jQuery.data方法,原文如下:
The jQuery.data() method allows us to attach data of any type to DOM elements in a way that is safe from circular references and therefore from memory leaks. We can set several distinct values for a single element and retrieve them later:
在jQuery的官方文檔中,提示用戶這jQuery.data()是一個低級的方法,應(yīng)該用.data()方法來代替。$.data( element, key, value )可以對DOM元素附加任何類型的數(shù)據(jù),但應(yīng)避免循環(huán)引用而導(dǎo)致的內(nèi)存泄漏問題。
二者都是用來在元素上存放數(shù)據(jù)也就平時所說的數(shù)據(jù)緩存,都返回jQuery對象,但是內(nèi)部的處理確有本質(zhì)的區(qū)別。
通過代碼對比,參考右邊代碼:
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報