在jQuery的attr與prop提到過在IE9以前版本中若是使用property不當會形成內存泄露問題,並且關於Attribute和Property的區別也讓人十分頭痛,在HTML5中添加了data-*的方式來自定義屬性,所謂data-*實際上上就是data-前綴加上自定義的屬性名,使用這樣的結構能夠進行數據存放。使用data-*能夠解決自定義屬性混亂無管理的現狀。css
data-*有兩種設置方式,能夠直接在HTML元素標籤上書寫html
<div id="test" data-age="24"> Click Here </div>
其中的data-age就是一種自定義屬性,固然咱們也能夠經過JavaScript來對其進行操做,HTML5中元素都會有一個dataset的屬性,這是一個DOMStringMap類型的鍵值對集合瀏覽器
var test = document.getElementById('test'); test.dataset.my = 'Byron';
這樣就爲div添加了一個data-my的自定義屬性,使用JavaScript操做dataset有兩個須要注意的地方this
1. 咱們在添加或讀取屬性的時候須要去掉前綴data-*,像上面的例子咱們沒有使用test.dataset.data-my = 'Byron';的形式。spa
2. 若是屬性名稱中還包含連字符(-),須要轉成駝峯命名方式,但若是在CSS中使用選擇器,咱們須要使用連字符格式code
爲剛纔代碼追加寫內容htm
<style type="text/css"> [data-birth-date] { background-color: #0f0; width:100px; margin:20px; } </style>
test.dataset.birthDate = '19890615';
這樣咱們經過JavaScript設置了data-birth-date自定義屬性,在CSS樣式表爲div添加了一些樣式,看看效果對象
讀取的時候也是經過dataset對象,使用」.」來獲取屬性,一樣須要去掉data-前綴,連字符須要轉化爲駝峯命名blog
var test = document.getElementById('test'); test.dataset.my = 'Byron'; test.dataset.birthDate = '19890615'; test.onclick = function () { alert(this.dataset.my + ' ' + this.dataset.age+' '+this.dataset.birthDate); }
有些同窗可能會問這和getAttribute/setAttribute除了命名有什麼區別嗎,咱們來看一下ip
var test = document.getElementById('test'); test.dataset.birthDate = '19890615'; test.setAttribute('age', 25); test.setAttribute('data-sex', 'male'); console.log(test.getAttribute('data-age')); //24 console.log(test.getAttribute('data-birth-date')); //19890516 console.log(test.dataset.age); //24 console.log(test.dataset.sex); //male
這樣咱們能夠看出,二者都把屬性設置到了attribute上(廢話,要不人家能叫自定義屬性),也就是說getAttribute/setAttribute能夠操做全部的dataset內容,dataset內容只是attribute的一個子集,特殊就特殊在命名上了,可是dataset內只有帶有data-前綴的屬性(沒有age=25那個)。
那麼爲何咱們還要用data-*呢,一個最大的好處是咱們能夠把全部自定義屬性在dataset對象中統一管理,遍歷啊神馬的都哦很方便,而不至於零零散散了,因此用用仍是不錯的。
比較很差的消息就是data-*的瀏覽器兼容性狀況十分不樂觀
其中IE11+簡直就是亮瞎小夥伴的眼,看來要想全面使用此屬性路漫漫其修遠矣