原文地址鏈接:http://blog.csdn.net/fly_zxy/article/details/50687691;
HTML5中的data-*屬性
我們往往會根據需要在HTML標記上添加自定義的屬性來存儲和操作數據,我們自定義的屬性名字也千奇百怪,五花八門。我們可以通過原生的getAttribute()或jQuery中的.attr()來獲取我們自定義的屬性。但是前端技術在向着規范化前進。HTML5標准規定,自定義的屬性都已data—*開頭,這樣就區分開了固有屬性和自定義屬性。HTML代碼如下:
- <div id="testDiv" data-cname="張三" data-e-name="zhangsan" data-myName="my name is zs.">測試在元素上存儲一個key-value</div>
- $(document).ready(function(){
- var el = document.getElementById("testDiv");
- console.log(el.dataset.cname);//=>張三
- el.dataset.cname = "ZS";//設置值為"ZS"
- console.log(el.dataset.cname);//=>"ZS"
- console.log("jQuery data:", $("#testDiv").data("eName") );
- $("#testDiv").data("eName", "abcefg");
- console.log("jQuery data:", $("#testDiv").data("eName") );
- console.log("遍歷testDiv上的自有屬性");
- $.each(el.dataset, function(key, value){
- console.log(key+":"+value);
- });
- //遍歷testDiv上的自有屬性
- //cname:ZS
- //eName:zhangsan
- //myname:my name is zs.
- <span style="white-space:pre"> </span>
- });
通過each打印的結果,我們需要注意:
1,如果data-后面包含了“-”,例如 date-e-name,"-"會去掉,並轉換成為駱駝峰式的命名 eName。這是因為JSON Object 的key不能包含”-“。
2,如果data-后面的單詞有大寫,例如 myName,將會轉存成小寫 myname。這里就不理解為什么會轉換成小寫了,JSON Object的key是區分大小寫的。求高人指定??
3,如果你想刪除一個data-*屬性,請使用 delete dataset.cname或者dataset.cname=null;
data-*屬性看起來很好,但是不幸的是只有在Chrome 8+ Firefox(Gecko) 6.0+ Internet Explorer 11+ Opera 11.10+ Safari 6+的瀏覽器中實現了此標准。如果你的腳步需要兼容各主流瀏覽器的不同版本建議還是使用原生的getAttribute()或jQuery中的.attr()。
jQuery中的.data()
jQuery中的.data()方法作用:在jQuery對象對應的DOM元素上獲取或存放key-value對。我們可以通過html5的data-*屬性在元素上存取數據,在jQuery也可以通過data()來實現。data()方法有多個重載,傳遞一個參數是獲取value值,傳遞兩個參數是存儲或覆蓋已存在的值,傳遞一個JSON Object是在元素上存儲或覆蓋已存在的多個key-value對。如果通過data() 在元素上存儲key-value,value可以是一個對象,而不是像data-*只能存儲一個字符串的value。下面給出一個綜合示例:
- <script id="jquery_183" type="text/javascript" class="library" src="//cdn.bootcss.com/jquery/2.2.0/jquery.js"></script>
- <!DOCTYPE html>
- <html>
- <head>
- </head>
- <body>
- <div id="testDiv" data-cname="張三" data-e-name="zhangsan" data-myName="my name is zs.">
- 測試在元素上存儲一個key-value
- </div>
- </body>
- </html>
- $(function(){
- function printVlaue(){
- //通過data()在testDiv元素上存儲 {ename:zhangsan} 健/值對。
- $("#testDiv").data("ename", "zhangsan");
- //修改data()通過 data-* 屬性存儲的值
- $("#testDiv").data("cname", "我是張三");
- console.log( "獲取通過data()存儲在testDiv元素上的ename值:", $("#testDiv").data("ename") );
- console.log( "獲取通過 data-* 存儲在testDiv元素上的cname值:", $("#testDiv").data("cname") );
- //$("#testDiv").jQueryremoveAttr("data-"+"abc");
- console.log( "獲取ename值:", $("#testDiv").data("ename") );
- console.log( "獲取cname值:", $("#testDiv").data("cname") )
- console.log("刪除testDiv元素上 ename 和 cname 鍵/值對。");
- $("#testDiv").removeData("ename");
- $("#testDiv").removeData("cname");
- console.log("輸出 eanem 和 canme 對應的值,看是否已經刪除");
- console.log( $("#testDiv").data("ename") );
- console.log( $("#testDiv").data("cname") );
- };
- $("<button>獲取值</button>").appendTo("body").bind("click", printVlaue);;
- console.log("debug use.");;
- });
- /*
- 獲取通過data()存儲在testDiv元素上的ename值: zhangsan
- 獲取通過 data-* 存儲在testDiv元素上的cname值: 我是張三
- 獲取ename值: zhangsan
- 獲取cname值: 我是張三
- 刪除testDiv元素上 ename 和 cname 鍵/值對。
- 輸出 eanem 和 canme 對應的值,看是否已經刪除
- undefined
- 張三
- */
- <script id="jquery_183" type="text/javascript" class="library"
- src="//cdn.bootcss.com/jquery/2.2.0/jquery.js"></script>
- <!DOCTYPE html>
- <html>
- <head>
- </head>
- <body>
- <div id="testDiv" data-cname="張三" data-e-nAme="zhangsan" data-myName="my name is zs.">
- 測試在元素上存儲一個key-value
- </div>
- </body>
- </html>
- $(document).ready(function(){
- function printValue(){
- var $testDiv = $("#testDiv").udDataAttr();
- console.log("udDataAttr get()=>", $testDiv.get("cname") );
- $testDiv.set("cname", "set 張三");
- console.log("udDataAttr get()=>", $testDiv.get("cname") );
- console.log("打印所有已data-*開頭的屬性和值=>", $testDiv.dataset());
- console.log("udDataAttr get e-name=>", $testDiv.get("e-name") );
- //var el = document.getElementById("testDiv");
- //console.log("el.dataset.eName=>", el.dataset.eName);
- };
- $("<button>獲取值</button>").appendTo("body").bind("click", printValue);
- console.log("debug use.");
- });
- (function($, window){
- //user-defined Attribute
- var plugName = "udDataAttr";
- $.fn[plugName] = function(){
- var $self = $(this),
- obj = ($self.length && $self[0].dataset) || null;
- return {
- get: function(name){
- return obj===null? $self.attr("data-"+name) : obj[ this._format(name) ];
- }
- ,set: function(name, value){
- if(obj === null){
- $self.attr("data-"+name, value);
- }else{
- obj[ this._format(name) ] = value;
- }
- return $self;
- }
- ,dataset: function(){
- var newObj = {};
- if(obj === null){
- $.each(obj, function(key, value){
- newObj[key] = value;
- });
- }else{
- newObj = $self.data(); //獲取所有以data-*開頭的屬性
- }
- return newObj;
- }
- /*
- * 將name轉換成dataset可識別的格式。
- * 例如:e-name 轉換成 eName
- * 總感覺 _format()的實現不是最優的,求高手給出實現
- */
- ,_format: function(name){
- console.log("_format old name=>",name);
- name = name.toLowerCase();
- if(name.indexOf('-')>-1){
- var array = name.split('-');
- for(var i=1,len=array.length; i<len; i++){
- var v = array[i];
- array[i] = v.substr(0,1).toUpperCase() + v.substr(1,v.length);
- name=array.join("");
- }
- }
- console.log("_format() new name=>",name);
- return name;
- }
- };
- };
- }(jQuery, window));