實例
使用 data-* 屬性來嵌入自定義數據:
<ul> <li data-animal-type="bird">Owl</li> <li data-animal-type="fish">Salmon</li> <li data-animal-type="spider">Tarantula</li> </ul>
瀏覽器支持
IE | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|
支持 | 支持 | 支持 | 支持 | 支持 |
所有主流瀏覽器都支持 data-* 屬性。
定義和用法
data-* 屬性用於存儲頁面或應用程序的私有自定義數據。
data-* 屬性賦予我們在所有 HTML 元素上嵌入自定義 data 屬性的能力。
存儲的(自定義)數據能夠被頁面的 JavaScript 中利用,以創建更好的用戶體驗(不進行 Ajax 調用或服務器端數據庫查詢)。
data-* 屬性包括兩部分:
- 屬性名不應該包含任何大寫字母,並且在前綴 "data-" 之後必須有至少一個字符
- 屬性值可以是任意字符串
註釋:用戶代理會完全忽略前綴爲 "data-" 的自定義屬性。
語法
<element data-*="somevalue">
屬性值
值 | 描述 |
---|---|
somevalue | 規定屬性的值(以字符串)。 |
==============【以上來自W3School】===================
【外加信息】
HTML標籤可以添加自定義屬性來存儲和操作數據。但這樣做會導致html語法上不符合Html規範。HTML5規範裏增加了一個自定義data屬性,自定義data屬性的用法非常的簡單,就可以往HTML標籤上添加任意以 "data-"開頭的屬性,這些屬性頁面上是不顯示的,它不會影響到你的頁面佈局和風格,但它卻是可讀可寫的。
下面的一個代碼片段是一個有效的HTML5標記:
<div id="item" data-id='123'>11111</div>
可是,怎麼來讀取這些數據呢?你當然可以遍歷頁面元素來讀取你想要的屬性,但jquery已經內置了方法來操作這些屬性。使用jQuery的.data()方法來訪問這些"data-*" 屬性。其中一個方法就是 .data(obj),這個方法是在 jQuery1.4.3版本後出現的,它能返回相應的data屬性。
舉個例子,你可以用下面的寫法讀取 data-id屬性值--123:
var myid= jQuery("#item").data('id');
你還可以在"data-*" 屬性裏使用json語法,
<div id="item" data-id='{"game":"on"}'></div>
你可以通過js直接訪問這個數據,通過json的key值,你能得到相應的value: var gameStatus= jQuery("#item").data('id').game;
你也可以通過.data(key,value)方法直接給"data-*" 屬性賦值。一個重要的你要注意的事情是,這些"data-*" 屬性應該和它所在的元素有一定的關聯,不要把它當成存放任意東西的存儲工具。儘管"data-*" 是HTML5纔出現的屬性,但jquery是通用的,所以,在非HTML5的頁面或瀏覽器裏,你仍然可以使用.data(obj)方法來操作"data-*" 數據。================
==============【data屬性低版本兼容】==================
【DEMO】
【效果】
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>dataset</title>
<style>
li{cursor: default;line-height: 1.8;}
table{border-collapse: collapse;}
th, td, caption{padding: 10px;border: 1px solid #ddd;font-size: 14px;}
th{color: #999;}
caption{font-size: 20px;font-weight: bold;border-bottom: none;}
#card{position: absolute;top: 10px;left: 150px;}
</style>
</head>
<body>
<ul>
<li data-id="123456" data-account-name="張威"
data-name="張威" data-email="[email protected]"
data-mobile="17777777777">張威</li>
<li data-id="123457" data-account-name="JokerWill"
data-name="JokerWill" data-email="[email protected]"
data-mobile="13333333333">JokerWill</li>
</ul>
<div id="card" style="display:none">
<table>
<caption id="accountName"></caption>
<tr><th>姓名:</th><td id="name"></td></tr>
<tr><th>郵箱:</th><td id="email"></td></tr>
<tr><th>手機:</th><td id="mobile"></td></tr>
</table>
</div>
<script>
function $(id){
return document.getElementById(id);
}
var lis = document.getElementsByTagName('li');
for(var i = 0, li;li = lis[i]; i++){
li.onmouseenter = function(event){
event = event || window.event;
var user = event.target|| event.srcElement;
//var data = user.dataset;
var data=get_dataset(user);
$('accountName').innerText = data.accountName;
$('name').innerText = data.name;
$('email').innerText = data.email;
$('mobile').innerText = data.mobile;
$('card').style.display = 'block';
};
li.onmouseleave = function(event){
$('card').style.display = 'none';
};
}
//帶兼容的函數
function get_dataset(ele){
if(ele.dataset)
return ele.dataset;
else{
//一下是兼容代碼
var dataset = {};
var ele_split = ele.outerHTML.split(" ");
for(var i = 0,element; i < ele_split.length; i++)
{
element = ele_split[i];
if (element.substring(0,4) == "data") {
if (element.indexOf(">") != -1) {
element = element.split(">")[0];
};
ele_key=element.split("=")[0].slice(5);
ele_value=element.split("=")[1].slice(1,-1);
if(ele_key.indexOf("-") == -1){
dataset[ele_key] = ele_value;
}else{
ele_keys=ele_key.split("-");
ele_key=ele_keys[0];
for(i=1;i<ele_keys.length;i++){
ele_key+=replaceReg(ele_keys[i]);
}
}
};
}
return dataset;
}
}
//正則表達式變換首字母大寫
function replaceReg(str){
var reg = /\b(\w)|\s(\w)/g;
str = str.toLowerCase();
return str.replace(reg,function(m){return m.toUpperCase()})
}
</script>
</body>
</html>
【關鍵代碼】
//帶兼容的函數
function get_dataset(ele){
if(ele.dataset)
return ele.dataset;
else{
//一下是兼容代碼
var dataset = {};
var ele_split = ele.outerHTML.split(" ");
for(var i = 0,element; i < ele_split.length; i++)
{
element = ele_split[i];
if (element.substring(0,4) == "data") {
if (element.indexOf(">") != -1) {
element = element.split(">")[0];
};
ele_key=element.split("=")[0].slice(5);
ele_value=element.split("=")[1].slice(1,-1);
if(ele_key.indexOf("-") == -1){
dataset[ele_key] = ele_value;
}else{
ele_keys=ele_key.split("-");
ele_key=ele_keys[0];
for(i=1;i<ele_keys.length;i++){
ele_key+=replaceReg(ele_keys[i]);
}
}
};
}
return dataset;
}
}