標籤:
DataSet是ADO.NET的中心概念。可以把DataSet當成記憶體中的資料庫,DataSet是不依賴於資料庫的獨立資料集合。所謂獨立,就是說,即使斷開資料鏈路,或者關閉資料庫,DataSet依然是可用的,DataSet在內部是用XML來描述資料的,由於XML是一種與平台無關、與語言無關的資料描述語言 (Data Description Language),而且可以描述複雜關係的資料,比如父子關係的資料,所以DataSet實際上可以容納具有複雜關係的資料,而且不再依賴於資料庫鏈路。
一.關於dataset
1.html5自訂屬性及基礎
html5中我們可以使用data-首碼設定我們需要的自訂屬性,來進行一些資料的存放,例如我們要在一個文字按鈕上存放相應的id:
複製代碼代碼如下:
<a href="javascript:;" data-id="2312">測試</a>
這裡的data-首碼就被稱為data屬性,其可以通過指令碼進行定義,也可以應用css屬性選取器進行樣式設定.數量不受限制,在控制和渲染資料的時候提供了非常強大的控制.
下面是元素應用data屬性的一個例子:
複製代碼代碼如下:
<div id="day-meal-expense" data-drink="tea" data-food="noodle" data-meal="lunch">$18.3</div>
要想擷取某個屬性的值,可以像下面這樣使用dataset對象:
?
| 12345 |
var expenseday=document.getElementById(‘day-meal-expense‘); var typeOfDrink=expenseday.dataset.drink; console.log(typeOfDrink);//tea console.log(expenseday.dataset.food);//noodle console.log(expenseday.dataset.meal);//lunch |
如果瀏覽器支援dataset,則會彈出注釋內容,如果瀏覽器不支援dataset則會報錯,無法擷取屬性drink/food/meal的值:對象為null或未定義(如IE9版本).
data屬性基本上所有的瀏覽器都是支援的,但是dataset對象支援的就比較特殊了,目前僅在Opera 11.1+,Chrome 9+下可以通過javascript,使用dataset訪問你自訂的data屬性.至於其他瀏覽器,FireFox 6+(未出)以及Safari 6+(未出)會支援dataset對象,至於IE瀏覽器,目前看來還是遙遙無期的趨勢.
需要注意的是帶邊字元串連的名稱在使用的時候需要命名駝峰化,即大小寫組合書寫,這與應用元素的style對象類似,dom.style.borderColor.例如,上面的例子中現有如下data屬性,data-meal-time,則我們要擷取相應的值可以使用:expenseday.dataset.mealTime
2.為何要使用dataset
如果使用傳統的方法擷取屬性值應該會類似下面:
var typeOfDrink=document.getElementById(‘day-meal-expense‘).getAttribute(‘data-drink‘);
現在,如果我們要獲得多個自訂的屬性值,就要用下面N行代碼來實現了:
?
| 123456 |
var attrs=expenseday.attributes, expense={},i,j;for (i=0,j=attrs.length;i<j;i++){ if(attrs[i].name.substring(0,5)==‘data-‘){ expense[attrs[i].name.substring(5)]=attrs[i].value; }} |
而使用dataset屬性,我們根本不需要任何迴圈去擷取你想要的那個值,直接秒殺:
expense=document.getElementById(‘day-meal-expense‘).dataset;
dataset並不是典型意義上的JavaScript對象,而是個DOMStringMap對象,DOMStringMap是HTML5一種新的含有多個名-值對的互動變數.
3.dataset的操作
可以像下面這樣操作名-值對:
?
| 1234 |
charInput=[]; for(var item in expenseday){ charInput.push(expenseday[item]); } |
上面這幾千代碼的作用是讓所有的自訂屬性塞到一個數組中.
如果你想刪除一個data屬性,可以這麼做:
?
| 12 |
delete expenseday.dataset.meal; console.log(expenseday.dataset.meal)//undefined |
如果你想給元素添加一個屬性,可以這麼做:
?
| 12 |
expenseday.dataset.dessert=‘icecream‘; console.log(expenseday.dataset.dessert);//icecream |
4.跟getAttribute相比的速度
使用dataset操作data要比使用getAttribute稍微慢些.
但是,如果我們只是處理少量的data資料,這種速度上的差異造成的影響是基本上沒有的.反而,我們應該看到,使用dataset操作自適應屬性要比其他類似getAttribute的形式要少很多讓人頭疼的麻煩,並且更具有可讀性.因此,權衡來看,操作自訂屬性,dataset操作是上選.
5.什麼地方使用dataset
每次你使用自訂data屬性的時候,使用dataset去擷取名-值對就是個不錯的選擇.考慮到現在很多瀏覽器還是把dataset當作不認識的外星生物看待,所以,在實際使用的時候,有必要進行一下特徵檢測,看看是否支援dataset,類似下面的使用:
?
| 12345 |
if(expenseday.dataset){ expenseday.dataset.dessert=‘icecream‘; }else{ expenseday.setAttribute(‘data-dessert‘,‘icecream‘); } |
注意:如果你的應用程式會頻繁更新data屬性,建議使用JavaScript對象進行資料管理,而不是每次都經由data屬性進行更新.
二.關於字面量賦值,數組賦值
?
| 1234567 |
var a=1,b=2;var c=[a,b];console.log(c);//[1,2]var b=3;console.log(c);//[1,2]var c=[a,b];console.log(c);//[1,3] |
上面賦給a,b的值都是數字,c是由a和b組成的數組,由於a,b的值就是1和2,所以var c=[a,b]就等於var c=[1,2];之後a和b的值再怎麼改變變與c=[1,2]無關了.
以上內容是關於javascript中dataset的問題小結,希望對大家學習有所協助。
關於javascript中dataset的問題小結