HTML data屬性簡介以及低版本瀏覽器兼容算法

實例

使用 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 規定屬性的值(以字符串)。

HTML adta-*屬性

==============【以上來自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;
	}

}


發佈了20 篇原創文章 · 獲贊 14 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章