在HTML5中添加了data-*的方式來自定義屬性,所謂data-*實際上上就是data-前綴加上自定義的屬性名,命名可以用駝峰命名方式,但取值是必需全部使用小寫(后面會說),使用這樣的結構可以進行數據存放。使用data-*可以解決自定義屬性混亂無管理的現狀。
1. Html綁定數據寫法
1.1簡單單詞:
<div id="testDiv" data-cd="24"> Click Here </div>
1.2 使用駝峰命名(需要特定注意的地方):
<div id="testDiv" data-cartCd="24"> Click Here </div>
2. 取綁定的值方法
原生的js取法:
var testDiv = document.getElementById('testDiv');
簡單的單詞:console.log(testDiv.dataset.cd);
復雜的駝峰命名單詞:console.log(testDiv.dataset.cartcd);//注意是“cartcd”,不管
//是不是駝峰命名,一切都是小些。
使用Jquery方法:
console.log($(“#testDiv”).data(“cd”));
console.log($(“testDiv”).data(“cartcd”));//同上面一樣,注意是“cartcd”,不管
//是不是駝峰命名,一切都是小些。
和html5的api不同的是,jQuery會嘗試將字符串轉換為一個JavaScript值(包括布爾值(booleans),數字(numbers),對象(objects),數組(arrays)和空(null))。
3. 修改綁定數據
原生js方式:
testDiv.dataset.cartcd= “新值”
Jquery方式:
$(“testDiv”).data(“cartcd”,”新值”)
其實這個屬性是html5新加的特性,為了綁定數據,我們可以將一些參數綁定到dom標簽上,而不用將數據填 到input標簽上然后隱藏該標簽。最需要注意的一點的取值時必需全部使用小寫的名字,”data-*”中名子可以用駝峰命名。
- <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打印的結果,我們需要注意:
jQuery中的.data()
- <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));