《JS DOM程式設計藝術》之個人總結

edithfang發表於2014-08-19
正文將從本書所強調的原則,書中的關鍵概念,書中較為實用的部分程式碼,還有把書中比較散的東西都總結在一起。  由於理解不透難免會有錯誤,敬請指正。

一:本書說強調的原則
        
1.以使用者體驗為第一,如無必須,勿增實體:
               
 一切的功能應該是為需求而產生的,過多的功能或不合時宜的展示都會分散注意力,都會影響使用者體驗。較好的標準是便捷,完整的滿足使用者需求是一個設計的基礎,在此之上增加的展示都需慎重,不能製造麻煩或讓人難以上手。

        
2.平穩退化與漸進增強:
                
JS和CSS都是對內容的修飾,既然是修飾就不能畫蛇添足,反而影響內容的顯示。內容是網站的核心,網站既然是一個獲取資訊的地方,在設計時就不能違反網站的本質。對資訊的準確完整呈現是首要任務,其它的都是對使用者體驗,操作的優化,視覺與操作都不允許損害內容。所以,當沒有JS與CSS時,內容也能完整呈現是必須首先做到的。寫程式碼時一定要想到,我的內容會不會受到它的影響,如果影響是否會對內容本身造成本質損害。
        
        
3.內容,表現,行為三者分離:
               
 這是對第2點的進一步闡述,程式設計中一直追求著每一個模組的相互獨立,相互獨立意味著好維護,好修改,少影響。在DOM後面或許JS與CSS有相互滲透,但是表現與行為對內容的聯絡應該努力做到最低。例如把JS與CSS作為外部連結來引用,與JS有關的標籤利用DOM來單獨建立,,CSS與JS都儘量做到不去修改內容等,都是在程式時要考慮的。

        
4.向後,向前相容:
                
保證內容的正確完整顯示是基本,即使相容是個讓人痛苦的問題,但也不能因為瀏覽器版本的問題就放棄部分使用者,向後做到保證大部分瀏覽器能正常檢視網頁,向前做到程式碼按最高規範,留出擴充套件空間,防止因規範變化等原因對內容顯示造成影響。同時,不要做出過多假設,對即將使用的方法判斷是否在此瀏覽器中可用,即將使用的物件是否存在做出檢測是個好習慣。
        
5.效能考慮:
                
對DOM的元素查詢會歷遍整個文件樹,所以DOM的元素獲取應該保持重用,減少歷遍次數;將獲得的放入變數中;合併壓縮指令碼,使得下載時間減少;指令碼放在內容後邊,先保證內容的顯示;減少for語句的巢狀;使用圖片合併的方法,減少HTTP請求等,效能在於細節的關注。
        
        
二:書中關鍵概念
  • 1. JS作為弱型別語言,意味著var相當於一個容器,把你要放的值都放進去。
  • 2. 無var的變數是全域性變數,任意處對它的賦值都將改變它。有var的變數在函式結束後便銷燬,只能在本函式內使用。整個函式外部定義的var變數也相對於全域性變數了。
  • 3. 文件樹包含元素,文字,屬性節點。所有帶node的屬性都會影響他們,如childNodes
  • []時就要數好當前是文字還是元素節點。
  • 4. 用 .style.property='' 是無法獲取或改變CSS中的屬性值的。
  • 5. Ajax主要是用XMLhtttpRquest物件的方法來傳送和響應請求,在響應函式裡面當響應從伺服器端發回時,並且資訊載入完成後利用DOM動態建立元素來呈現發來的內容。
  • 6. 動畫中,採用把setTimeout的返回值賦給全域性變數movement來取消動作函式,會導致即使暫停時movement仍有值,會繼續完成上次的動作。使用elem.movement=setTimout(),設定為變數屬性的方法,就能在下次改變時檢測movement的存在,取消上次的動作。

三:書中較為實用的部分程式碼
        
1.為某元素新增CSS屬性,通過為新增類名連線到CSS樣式的方法,注意兩類名間有空格:          
 function addClass(element,value) {
                if(!element.className) {
                        element.className = value;
                        } else {
                        var newClassName = element.className;
                        newClassName += " ";
                        newClassName += value;
                        element.className = newClassName;
                        }
                }                           
                
2.取消<a>的連結行為:               
<a href="images.coffee.jpg" onclick="showPic("this"); return false;">Rose</a>      
  
3.實現隔行換色:                      
 function stripeTables() {
                if(!document.getElementsByTagName) return false;
                var tables = document.getElementsByTagName("table");
                for(var i = 0; i < tables.length; i++) {
                        var odd = false;
                        var rows = tables.getElementsByTagName("tr");
                for(var j = 0; j < rows.length; j++) {
                        if(odd == true) {
                        addClass(rows[j],"className");
                        odd = false;
                        } else {
                        odd = true;
                        }
                        }
                        }
                }        

3.頁面載入後實現多個函式:                   
function addLoadEvent(func) {
                var oldonload = window.onload;
                if(typeof window.onload != 'function') {
                window.onload = func;
                } else {
                window.onload = function() {
                        oldonload();
                        func();
                        }
                        }
                }
4.將一個元素插入現有元素前面:              
function insertAfter(newElement,targetElement) {
                var parent = targetElement.parentNode;
                if(parent.lastChild == targetElement) {
                parent.appendChild(newElement);
                } else {
                parent.insertBefore(newElement,targetElement.nextSibling);
                        }
                }
四:一些分散知識集合:
        
常用DOM方法
  • document.getElementById(id)                                       由id屬性值得到某個元素節點物件
  • document.getElementsByTagName(tagname)         由節點/標籤名得到所有該節點物件的陣列
  • object.getAttribute(attribute)                                得到元素節點物件的屬性值
  • object.setAttibute(attribute,value)                         設定元素節點物件的屬性值
  • node.parentNode                                                 得到父節點
  • node.nextSibling                                                  得到下一個兄弟節點
  • element.childNodes                                                 得到一個陣列,包含給定元素節點的全體子元素。包括元素節點,屬性節點,和文字節點
  • node.nodeType                                                          元素節點返回1,屬性節點返回2,文字節點返回3
  • node.nodeValue                                                         檢索節點的值。
  • node.firstChild                                                        相當於node.childNodes
  • [0]        ,得到節點的第一個子節點
  • node.lastChild node.lastChild                                相當於node.childNodes
  • [node.childNodes.length-1],節點的最後一個子節點
  • document.write()                                                 把字串插入到文件中
  • object.innerHTML                                                用來讀寫某給定元素裡的HTML內容。不屬於W3C DOM標準組成部分。
  • document.createElement(nodeName)                         建立一個節點
  • document.createTextNode(text)                                 建立一個文字節點
  • parentNode.appendChild(child)                                 為一個元素節點新增子節點


其它方法:
  • parseInt()                                                        獲取字串中的數字
  • setTimeout(“function”,interval)              能夠讓某函式在經過一段預定時間(毫秒為單位)之後才開始執行
  • clearTimeout(variable)                                   清除時間函式,variable儲存著某個setTimeout函式呼叫返回值的變數
評論(2)

相關文章