對 jQuery 中 data 方法的誤解分析
今天 謝亮 兄弟和我討論一個東西的時(shí)候,談到了性能,他用的是 attr 操作自定義屬性 data-uid,我說用 data 好,因?yàn)槭?dataset 實(shí)現(xiàn),然后他去翻了下 jQuery 源碼和我說,沒有發(fā)現(xiàn)這個東西,我就納悶了。于是我去仔細(xì)讀了下 data 方法的源碼,才發(fā)現(xiàn)我一直誤會了,再此,向之前問我 data 方法的群友道歉,我 "騙" 了你們,你們來打我吧。
今天我就重新解釋下 data 方法,先看下 jQuery 1.11.0 的手冊里腫么說的吧,請移步至http://shouce.jb51.net/jquery/data.html、
用法這里說的很清楚了,但是內(nèi)部是怎么實(shí)現(xiàn)的呢? 戳我看源碼 (看不懂沒關(guān)系,我會簡單分析下他的流程)
其實(shí)是這樣的,當(dāng)我們執(zhí)行例如這樣的語句時(shí) $("#id").data("test"); (簡化后的過程)
第一步: jQuery 會獲取到 $("#id") 元素,對吧、
第二步: 執(zhí)行到 data方法 的時(shí)候,他會通過 attributes 取我們要的對應(yīng)值。
第三步: 返回結(jié)果給我們,然后 jQuery 把值緩存到內(nèi)部對象里
第一次取的時(shí)候,我們可以得到的 undefined,字符串,數(shù)字或者解析后的json。
那有人會說這個和 attr 有什么區(qū)別呢?
當(dāng)我們第二次執(zhí)行 $("#id").data("test"); 的時(shí)候:
第一步: jQuery 會獲取到 $("#id") 元素,和上面一樣。
第二步: 執(zhí)行到 data方法 的時(shí)候,從 jQuery 的緩存中取值
第三步: 返回結(jié)果給我們
發(fā)現(xiàn)第二步不同了,對吧,為什么不是從 attributes 取值,而是從緩存中取呢?
緩存其實(shí)是js的對象,簡單說就類似 var cache = {}; jQuery 在第一次取值之后就會保存到這個緩存對象中,這樣我們再次操作的時(shí)候就非??炝?、
往往性能的損耗都是在 dom 操作上,所以避免重復(fù)操作 dom 是非常必要的。
到這,也能看出他和 attr 最大的區(qū)別了,比如 <div id="id" data-test="hehe"></div>
$("#id").data("test", "123"); 執(zhí)行后依然是 data-test="hehe"
$("#id").attr("data-test", "123"); 執(zhí)行后會是 data-test="123"
那么我們要給一個元素賦值值,或者對象的時(shí)候他們有什么區(qū)別呢?比如 <div id="id" data-test="hehe"></div>
$("#id").data("test", {str: "hehe"}); 會把 {str: "hehe"} 賦值給 緩存,元素節(jié)點(diǎn)上依然是 data-test="hehe"
$("#id").attr("data-test", {str: "hehe"}); 執(zhí)行后會是 data-test="[object Object]"
這個應(yīng)該也有不少人遇到,至少群里有不少人問過這個問題。
其實(shí)我之前也沒騙你們,自定義屬性沒必要老是 attr 他,data 是 jQuery 賦予我們的一把瑞士軍刀,非常鋒利的。
好了,我是懶人,懶的配圖,已經(jīng)寫了不少字了,如果有什么說的不對的地方,你們來打我吧
- 解決3.01版的jquery.form.js中文亂碼問題的解決方法
- JQuery中dataGrid設(shè)置行的高度示例代碼
- Jquery下EasyUI組件中的DataGrid結(jié)果集清空方法
- jQuery中使用data()方法讀取HTML5自定義屬性data-*實(shí)例
- jquery用data方法獲取某個元素上的事件
- bootstrap data與jquery .data
- jquery datatable后臺封裝數(shù)據(jù)示例代碼
- jquery操作HTML5 的data-*的用法實(shí)例分享
- jQuery表格插件datatables用法總結(jié)
- jQuery 3.0 的變化及使用方法
- 淺析jQuery 3.0中的Data
相關(guān)文章
jquery ajax學(xué)習(xí)筆記2 使用XMLHttpRequest對象的responseXML
使用XMLHttpRequest對象的responseXML的方式來接受XML數(shù)據(jù)對象的DOM對象2011-10-10
jquery 倒計(jì)時(shí)效果實(shí)現(xiàn)秒殺思路
公司做了個秒殺頁面,需要做一個倒計(jì)時(shí)效果,感覺還特此收藏,喜歡的朋友也可以學(xué)習(xí)下2013-09-09
基于jQuery的讓textarea支持Ctrl+Z步步撤銷功能
基于jQuery的讓textarea支持Ctrl+Z步步撤銷功能,需要的朋友可以參考下。2011-10-10
jQuery UI Draggable + Sortable 結(jié)合使用(實(shí)例講解)
下面小編就為大家?guī)硪黄猨Query UI Draggable + Sortable 結(jié)合使用(實(shí)例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
jQuery實(shí)現(xiàn)簡易的輸入框字?jǐn)?shù)計(jì)數(shù)功能示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)簡易的輸入框字?jǐn)?shù)計(jì)數(shù)功能,結(jié)合實(shí)例形式分析了jQuery針對頁面元素屬性的獲取與計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
jquery插件jquery.beforeafter.js實(shí)現(xiàn)左右拖拽分隔條對比圖片的方法
這篇文章主要介紹了jquery插件jquery.beforeafter.js實(shí)現(xiàn)左右拖拽分隔條對比圖片的方法,可實(shí)現(xiàn)圖片拖拽變換的功能,需要的朋友可以參考下2015-08-08
jquery實(shí)現(xiàn)多行文字圖片滾動效果示例代碼
多行文字圖片滾動效果的實(shí)現(xiàn)方法有很多,本例與大家分享的是jquery實(shí)現(xiàn)的具體步驟,很實(shí)用的2014-10-10
把html頁面的部分內(nèi)容保存成新的html文件的jquery代碼
把html頁面的部分內(nèi)容保存成新的html文件,用到了jquery的獲取指定id的內(nèi)容。然后保存代碼。2009-11-11
(jQuery,mootools,dojo)使用適合自己的編程別名命名
我們經(jīng)常用一些別名方法來使用自己喜歡的js 庫。學(xué)習(xí)javascript的朋友可以參考下。2010-09-09

