JavaScript的DOM操做表格及樣式

DOM 在操做生成HTML 上,仍是比較簡明的。不過,因爲瀏覽器老是存在兼容和陷阱,
致使最終的操做就不是那麼簡單方便了。本章主要了解一下DOM 操做表格和樣式的一些知
識。css


一.操做表格
<table>標籤是HTML 中結構最爲複雜的一個,咱們能夠經過DOM 來建立生成它,或
者HTML DOM 來操做它。(PS:HTML DOM 提供了更加方便快捷的方式來操做HTML,有
手冊)。編程

  
  
           
  
  
  1. //須要操做的table 
  2. <table border="1" width="300"> 
  3. <caption>人員表</caption> 
  4. <thead> 
  5. <tr> 
  6. <th>姓名</th> 
  7. <th>性別</th> 
  8. <th>年齡</th> 
  9. </tr> 
  10. </thead> 
  11. <tbody> 
  12. <tr> 
  13. <td>張三</td> 
  14. <td></td> 
  15. <td>20</td> 
  16. </tr> 
  17. <tr> 
  18. <td>李四</td> 
  19. <td></td> 
  20. <td>22</td> 
  21. </tr> 
  22. </tbody> 
  23. <tfoot> 
  24. <tr> 
  25. <td colspan="3">合計:N</td> 
  26. </tr> 
  27. </tfoot> 
  28. </table> 
  
  
           
  
  
  1. //使用DOM 來建立這個表格 
  2. var table = document.createElement('table'); 
  3. table.border = 1; 
  4. table.width = 300; 
  5. var caption = document.createElement('caption'); 
  6. table.appendChild(caption); 
  7. caption.appendChild(document.createTextNode('人員表')); 
  8. var thead = document.createElement('thead'); 
  9. table.appendChild(thead); 
  10. var tr = document.createElement('tr'); 
  11. thead.appendChild(tr); 
  12. var th1 = document.createElement('th'); 
  13. var th2 = document.createElement('th'); 
  14. var th3 = document.createElement('th'); 
  15. tr.appendChild(th1); 
  16. th1.appendChild(document.createTextNode('姓名')); 
  17. tr.appendChild(th2); 
  18. th2.appendChild(document.createTextNode('年齡')); 
  19. document.body.appendChild(table); 

PS:使用DOM 來建立表格其實已經沒有什麼難度,就是有點兒小煩而已。下面咱們再
使用HTML DOM 來獲取和建立這個相同的表格。瀏覽器

PS:由於表格較爲繁雜,層次也多,在使用以前所學習的DOM 只是來獲取某個元素會
很是難受,因此使用HTML DOM 會清晰不少。服務器

  
  
           
  
  
  1. //使用HTML DOM 來獲取表格元素 
  2. var table = document.getElementsByTagName('table')[0]; //獲取table 引用 
  3. //按照以前的DOM 節點方法獲取<caption> 
  4. alert(table.children[0].innerHTML); //獲取caption 的內容 

PS:這裏使用了children[0]自己就忽略了空白,若是使用firstChild 或者childNodes[0]
須要更多的代碼。app

  
  
           
  
  
  1. //按HTML DOM 來獲取表格的<caption> 
  2. alert(table.caption.innerHTML); //獲取caption 的內容 
  3. //按HTML DOM 來獲取表頭表尾<thead>、<tfoot> 
  4. alert(table.tHead); //獲取表頭 
  5. alert(table.tFoot); //獲取表尾 
  6. //按HTML DOM 來獲取表體<tbody> 
  7. alert(table.tBodies); //獲取表體的集合 

PS:在一個表格中<thead>和<tfoot>是惟一的,只能有一個。而<tbody>不是惟一的能夠
有多個,這樣致使最後返回的<thead>和<tfoot>是元素引用,而<tbody>返回的是元素集合。ide

  
  
           
  
  
  1. //按HTML DOM 來獲取表格的行數 
  2. alert(table.rows.length); //獲取行數的集合,數量 
  3. //按HTML DOM 來獲取表格主體裏的行數 
  4. alert(table.tBodies[0].rows.length); //獲取主體的行數的集合,數量 
  5. //按HTML DOM 來獲取表格主體內第一行的單元格數量(tr) 
  6. alert(table.tBodies[0].rows[0].cells.length); //獲取第一行單元格的數量 
  7. //按HTML DOM 來獲取表格主體內第一行第一個單元格的內容(td) 
  8. alert(table.tBodies[0].rows[0].cells[0].innerHTML); //獲取第一行第一個單元格的內容 
  9. //按HTML DOM 來刪除標題、表頭、表尾、行、單元格 
  10. table.deleteCaption(); //刪除標題 
  11. table.deleteTHead(); //刪除<thead> 
  12. table.tBodies[0].deleteRow(0); //刪除<tr>一行 
  13. table.tBodies[0].rows[0].deleteCell(0); //刪除<td>一個單元格 
  14. //按HTML DOM 建立一個表格 
  15. var table = document.createElement('table'); 
  16. table.border = 1; 
  17. table.width = 300; 
  18. table.createCaption().innerHTML = '人員表'
  19. //table.createTHead(); 
  20. //table.tHead.insertRow(0); 
  21. var thead = table.createTHead(); 
  22. var tr = thead.insertRow(0); 
  23. var td = tr.insertCell(0); 
  24. td.appendChild(document.createTextNode('數據')); 
  25. var td2 = tr.insertCell(1); 
  26. td2.appendChild(document.createTextNode('數據2')); 
  27. document.body.appendChild(table); 

PS:在建立表格的時候<table>、<tbody>、<th>沒有特定的方法,須要使用document
來建立。也能夠模擬已有的方法編寫特定的函數便可,例如:insertTH()之類的。函數


二.操做樣式
CSS 做爲(X)HTML 的輔助,能夠加強頁面的顯示效果。但不是每一個瀏覽器都能支持最
新的CSS 能力。CSS 的能力和DOM 級別密切相關,因此咱們有必要檢測當前瀏覽器支持
CSS 能力的級別。
DOM1 級實現了最基本的文檔處理,DOM2 和DOM3 在這個基礎上增長了更多的交互
能力,這裏咱們主要探討CSS,DOM2 增長了CSS 編程訪問方式和改變CSS 樣式信息。學習

  
  
           
  
  
  1. //檢測瀏覽器是否支持DOM1 級CSS 能力或DOM2 級CSS 能力 
  2. alert('DOM1 級CSS 能力:' + document.implementation.hasFeature('CSS''2.0')); 
  3. alert('DOM2 級CSS 能力:' + document.implementation.hasFeature('CSS2''2.0')); 

PS:這種檢測方案在IE 瀏覽器上不精確,IE6 中,hasFeature()方法只爲HTML 和版本
1.0 返回true,其餘全部功能均返回false。但IE 瀏覽器仍是支持最經常使用的CSS2 模塊。
1.訪問元素的樣式
任何HTML 元素標籤都會有一個通用的屬性:style。它會返回CSSStypeDeclaration 對
象。下面咱們看幾個最多見的行內style 樣式的訪問方式。spa

  
  
           
  
  
  1. var box = document.getElementById('box'); //獲取box 
  2. box.style.cssFloat.style; //CSSStyleDeclaration 
  3. box.style.cssFloat.style.color; //red 
  4. box.style.cssFloat.style.fontSize; //20px 
  5. box.style.cssFloat || box.style.styleFloat; //left,非IE 用cssFloat,IE 用styleFloat 

PS:以上取值方式也能夠賦值,最後一種賦值能夠以下:xml

  
  
           
  
  
  1. typeof box.style.cssFloat != 'undefined' ? box.style.cssFloat = 'right' : box.style.styleFloat = 'right'

 

  
  
           
  
  
  1. box.style.cssText; //獲取CSS 代碼 
  2. //box.style.length; //3,IE 不支持 
  3. //box.style.removeProperty('color'); //移除某個CSS 屬性,IE 不支持 
  4. //box.style.setProperty('color','blue'); //設置某個CSS 屬性,IE 不支持 

PS:Firefox、Safari、Opera9+、Chrome 支持這些屬性和方法。IE 只支持cssText,而
getPropertyCSSValue()方法只有Safari3+和Chrome 支持。
PS:style 屬性僅僅只能獲取行內的CSS 樣式,對於另外兩種形式內聯<style>和連接
<link>方式則沒法獲取到。


雖然能夠經過style 來獲取單一值的CSS 樣式,但對於複合值的樣式信息,就須要經過
計算樣式來獲取。DOM2 級樣式,window 對象下提供了getComputedStyle()方法。接受兩個
參數,須要計算的樣式元素,第二個僞類(:hover),若是沒有沒有僞類,就填null。


PS:IE 不支持這個DOM2 級的方法,但有個相似的屬性可使用currentStyle 屬性。

  
  
           
  
  
  1. var box = document.getElementById('box'); 
  2. var style = window.getComputedStyle ? 
  3. window.getComputedStyle(box, null) : null || box.currentStyle; 
  4. alert(style .color); //顏色在不一樣的瀏覽器會有rgb()格式 
  5. alert(style .border); //不一樣瀏覽器不一樣的結果 
  6. alert(style .fontFamily); //計算顯示覆合的樣式值 
  7. alert(box.style.fontFamily); //空 

PS:border 屬性是一個綜合屬性,因此他在Chrome 顯示了,Firefox 爲空,IE 爲undefined。
所謂綜合性屬性,就是XHTML 課程裏所的簡寫形式,因此,DOM 在獲取CSS 的時候,最
好採用完整寫法兼容性最好,好比:border-top-color 之類的。


2.操做樣式表
使用style 屬性能夠設置行內的CSS 樣式,而經過id 和class 調用是最經常使用的方法。

  
  
           
  
  
  1. box.id = 'pox'//把ID 改變會帶來災難性的問題 
  2. box.className = 'red'//經過className 關鍵字來設置樣式 

在添加className 的時候,咱們想給一個元素添加多個class 是沒有辦法的,後面一個
必將覆蓋掉前面一個,因此必須來寫個函數:

  
  
           
  
  
  1. //判斷是否存在這個class 
  2. function hasClass(element, className) { 
  3. return element.className.match(new RegExp('(\\s|^)'+className+'(\\s|$)')); 
  4. //添加一個class,若是不存在的話 
  5. function addClass(element, className) { 
  6. if (!hasClass(element, className)) { 
  7. element.className += " "+className; 
  8. //刪除一個class,若是存在的話 
  9. function removeClass(element, className) { 
  10. if (hasClass(element, className)) { 
  11. element.className = element.className.replace( 
  12. new RegExp('(\\s|^)'+className+'(\\s|$)'),' '); 

以前咱們使用style 屬性,僅僅只能獲取和設置行內的樣式,若是是經過內聯<style>或
連接<link>提供的樣式規則就迫不得已了,而後咱們又學習了getComputedStyle 和
currentStyle,這隻能獲取卻沒法設置。
CSSStyleSheet 類型表示經過<link>元素和<style>元素包含的樣式表。

  
  
           
  
  
  1. document.implementation.hasFeature('StyleSheets''2.0'//是否支持DOM2 級樣式表 
  2. document.getElementsByTagName('link')[0]; //HTMLLinkElement 
  3. document.getElementsByTagName('style')[0]; //HTMLStyleElement 

這兩個元素自己返回的是HTMLLinkElement 和HTMLStyleElement 類型,但
CSSStyleSheet 類型更加通用一些。獲得這個類型非IE 使用sheet 屬性,IE 使用styleSheet;

  
  
           
  
  
  1. var link = document.getElementsByTagName('link')[0]; 
  2. var sheet = link.sheet || link.styleSheet; //獲得CSSStyleSheet 

 

  
  
           
  
  
  1. sheet.disabled; //false,可設置爲true 
  2. sheet.href; //css 的URL 
  3. sheet.media; //MediaList,集合 
  4. sheet.media[0]; //第一個media 的值 
  5. sheet.title; //獲得title 屬性的值 
  6. sheet.c***ules //C×××uleList,樣式表規則集合 
  7. sheet.deleteRule(0); //刪除第一個樣式規則 
  8. sheet.insertRule("body {background-color:red}", 0); //在第一個位置添加一個樣式規則 

PS:除了幾個不用和IE 不支持的咱們忽略了,還有三個有IE 對應的另外一種方式:

  
  
           
  
  
  1. sheet.rules; //代替c***ules 的IE 版本 
  2. sheet.removeRule(0); //代替deleteRule 的IE 版本 
  3. sheet.addRule("body""background-color:red", 0);//代替insertRule 的IE 版本 

除了剛纔的方法能夠獲得CSSStyleSheet 類型,還有一種方法是經過document 的
styleSheets 屬性來獲取。

  
  
           
  
  
  1. document.styleSheets; //StyleSheetList,集合 
  2. var sheet = document.styleSheets[0]; //CSSStyleSheet,第一個樣式表對象 

爲了添加CSS 規則,而且兼容全部瀏覽器,咱們必須寫一個函數:

  
  
           
  
  
  1. var sheet = document.styleSheets[0]; 
  2. insertRule(sheet, "body""background-color:red;", 0); 
  3. function insertRule(sheet, selectorText, cssText, position) { 
  4. //若是是非IE 
  5. if (sheet.insertRule) { 
  6. sheet.insertRule(selectorText + "{" + cssText + "}", position); 
  7. //若是是IE 
  8. else if (sheet.addRule) { 
  9. sheet.addRule(selectorText, cssText, position); 

爲了刪除CSS 規則,而且兼容全部瀏覽器,咱們必須寫一個函數:

  
  
           
  
  
  1. var sheet = document.styleSheets[0]; 
  2. deleteRule(sheet, 0); 
  3. function deleteRule(sheet, index) { 
  4. //若是是非IE 
  5. if (sheet.deleteRule) { 
  6. sheet.deleteRule(index); 
  7. //若是是IE 
  8. else if (sheet.removeRule) { 
  9. sheet.removeRule(index); 

經過C×××ules 屬性(非IE)和rules 屬性(IE),咱們能夠得到樣式表的規則集合列表。這
樣咱們就能夠對每一個樣式進行具體的操做了。

  
  
           
  
  
  1. var sheet = document.styleSheets[0]; //CSSStyleSheet 
  2. var rules = sheet.c***ules || sheet.rules; //C×××uleList,樣式表的規則集合列表 
  3. var rule = rules[0]; //CSSStyleRule,樣式表第一個規則 

  
  
           
  
  
  1. rule.cssText; //當前規則的樣式文本 
  2. rule.selectorText; //#box,樣式的選擇符 
  3. rule.style.color; //red,獲得具體樣式值 

PS:Chrome 瀏覽器在本地運行時會出現問題,rules 會變成null,只要把它放到服務器
上容許便可正常。

總結:三種操做CSS 的方法,第一種style 行內,可讀可寫;第二種行內、內聯和連接, 使用getComputedStyle 或currentStyle,可讀不可寫;第三種c***ules 或rules,內聯和連接 可讀可寫。

相關文章
相關標籤/搜索