JavaScript學習總結(三)BOM和DOM詳解

trigkit4發表於2016-09-16

DOM介紹

D(文件)可以理解為整個Web載入的網頁文件,O(物件)可以理解為類似window物件只來的東西,可以呼叫屬性和方法,這裡我們說的是document物件,M(模型)可以理解為網頁文件的樹形結構,DOM樹由節點構成

節點種類:元素節點、文字節點和屬性節點

DOM(文件物件模型)是 HTML 和 XML 的應用程式介面(API)。DOM代表著被載入到瀏覽器視窗裡的當前網頁:瀏覽器向我們提供了當前網頁的地圖(或者說模型),而我們可以通過js去讀取這張地圖。

BOM 主要處理瀏覽器視窗和框架,不過通常瀏覽器特定的 JavaScript 擴充套件都被看做 BOM 的一部分。這些擴充套件包括:

彈出新的瀏覽器視窗
移動、關閉瀏覽器視窗以及調整視窗大小
提供 Web 瀏覽器詳細資訊的定位物件
提供使用者螢幕解析度詳細資訊的螢幕物件
對 cookie 的支援
IE 擴充套件了 BOM,加入了 ActiveXObject 類,可以通過 JavaScript 例項化 ActiveX 物件

window物件對應著瀏覽器視窗本身,這個物件的屬性和方法通常被稱為BOM

DOM包含:window

Window物件包含屬性:document、location、navigator、screen、history、frames

Document根節點包含子節點:forms、location、anchors、images、links

window.document已然可以看出,DOM的最根本的物件是BOMwindow物件的子物件。

區別:DOM描述了處理網頁內容的方法和介面,BOM描述了與瀏覽器進行互動的方法和介面。

根據W3C DOM規範,DOM是HTML與XML的應用程式設計介面(API),DOM將整個頁面對映為一個由層次節點組成的檔案。有1級、2級、3級共3個級別。

先來看看下面程式碼:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
            <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
            <title>DOM</title>
    </head>
    <body>
            <h2><a href="http://www.baidu.com">javascript DOM</a></h2>
            <p>對HTML元素進行操作,可新增、改變或移除css樣式等</p>
            <ul>
                    <li>Javascript</li>
                    <li>DOM</li>
                    <li>CSS</li>
            </ul>
    </body>
    </html>

將HTML程式碼分解為DOM節點層次圖:

**HTML文件可以說由節點構成的集合,DOM節點有:**
  1. 元素節點:上圖中<html>、<body>、等都是元素節點,即標籤。
  2. 文字節點:向使用者展示的內容,如<li>…</li>中的JavaScript、DOM、CSS等文字。
  3. 屬性節點:元素屬性,如標籤的連結屬性href=”http://www.baidu.com”。

查詢元素

W3C提供了比較方便的定位節點的方法和屬性,如下所示:
| 方法 | 說明 |
| ————- |:————-:|
| getElementById() | 獲取特定ID元素的節點 |
| getElementsByTagName() | 獲取相同元素的節點列表 |
| getElementsByName | 獲取相同名稱的節點列表 |
| getAttribute() | 獲取特定元素節點屬性的值 |
| setAttribute() | 設定特定元素節點屬性的值 |
| removeAttribute() | 移除特定元素節點屬性 |

元素節點屬性

節點屬性
nodeName 返回一個字串,其內容是節點的名字
nodeType 返回一個整數,這個數值代表給定節點的型別
nodeValue 返回給定節點的當前值

| 屬性 |說明 |
| ————- |:————-:|
| tagName | 獲取原酸節點的標籤名 |
| innerHTML | 獲取元素節點的內容 |

遍歷節點樹

遍歷節點樹
childNodes 返回一個陣列,這個陣列由給定元素的子節點構成
firstChild 返回第一個子節點
lastChild 返回最後一個子節點
parentNode 返回一個給定節點的父節點
nextSibling 返回給定節點的下一個子節點
previousSibling 返回給定節點的上一個子節點

DOM操作

DOM操作
creatElement(element) 建立一個新的元素節點
creatTextNode() 建立一個包含給定文字的新文字節點
appendChild() 指定節點的最後一個節點列表後新增一個新的子節
insertBefore() 將一個給定節點插入到一個給定元素節點的給定子節點的前面
removeChild() 從一個給定元素中刪除子節點
replaceChild() 把一個給定父元素裡的一個子節點替換為另外一個節點

DOM通過建立樹來表示文件,描述了處理網頁內容的方法和介面,從而使開發者對文件的內容和結構具有空前的控制力,用DOM API可以輕鬆地刪除、新增和替換節點。

1. 訪問節點

`var oHtml = document.documentElement;`  //返回存在於 XML 以及 HTML 文件中的文件根節點,oHtml包含了一個表示<html />的HTMLElement物件
`document.body` //是對 HTML 頁面的特殊擴充套件,提供了對 <body> 標籤的直接訪問</span><span></span></span>
`document.getElementById("ID")` //通過指定的 ID 來返回元素,getElementById() 無法工作在 XML 中,IE6還會返回name為指定ID的元素
`document.getElementByName("name")`//獲取所有name特性等於指定值的元素,不過在IE6和Opera7.5上還會返回id為給定名稱的元素且僅檢查<input/>和<img/>
`var x=document.getElementsByTagName("p");` //使用指定的標籤名返回所有的元素列表NodeList,索引號從0開始。當引數是一個星號的時候,IE6並不返回所有的元素,必須用document.all來替代

2. Node節點的特性和方法

firstChild  //Node,指向在childNodes列表中的第一個節點  
lastChild  //Node,指向在childNodes列表中的最後一個節點  
parentNode  //Node,指向父節
ownerDocument //Document,指向這個節點所屬的文件 
firstChild  //Node,指向在childNodes列表中的第一個節點   
lastChild  //Node,指向在childNodes列表中的最後一個節點   
parentNode  //Node,指向父節點   
childNodes //NodeList,所有子節點的列表  
previousSibling  /Node,/指向前一個兄弟節點:如果這個節點就是第一個節點,那麼該值為 null  
`nextSibling`  //Node,指向後一個兄弟節點:如果這個節點就是最後一個節點,那麼該值為null 
`hasChildNodes()`  //Boolean,當childNodes包含一個或多個節點時,返回真值

3.DOM事件

DOM同時兩種事件模型:冒泡型事件和捕獲型事件  
    冒泡型事件:事件按照從最特定的事件目標到最不特定的事件目標的順序觸發  
    <body onclick="handleClick()">  
        <div onclick="handleClick()">Click Me</div>  
    </body>  
    觸發的順序是:div、body、html(IE 6.0和Mozilla 1.0)、document、window(Mozilla 1.0)  

    捕獲型事件:與冒泡事件相反的過程,事件從最不精確的物件開始觸發,然後到最精確  
    上面例子觸發的順序是:document、div  
    DOM事件模型最獨特的性質是,文字節點也觸發事件(在IE中不會)。

4.事件處理函式/監聽函式

 **事件處理函式/監聽函式**  
在JavaScript中:  
var oDiv = document.getElementById("div1");  
oDiv.onclick = function(){  //onclick只能用小寫,預設為冒泡型事件  
    alert("Clicked!");  
}  

在HTML中:  
<div onclick="javascript: alert("Clicked!")"></div>  //onclick大小寫任意

IE事件處理程式

attachEvent()和detachEvent()

在IE中,每個元素和window物件都有兩個方法:attachEvent()和detachEvent(),這兩個方法接受兩個相同的引數,事件處理程式名稱和事件處理程式函式,如:

[object].attachEvent("name_of_event_handler","function_to_attach")  
[object].detachEvent("name_of_event_handler","function_to_remove")  
var fnClick = function(){  
    alert("Clicked!");  
}  
oDiv.attachEvent("onclick", fnClick);  //新增事件處理函式  
oDiv.attachEvent("onclick", fnClickAnother);  // 可以新增多個事件處理函式  
oDiv.detachEvent("onclick", fnClick);  //移除事件處理函式

在使用attachEvent()方法的情況下,事件處理程式會在全域性作用域中執行,因此this等於window。

跨瀏覽器的事件處理程式

addHandler()和removeHandler()

addHandler()方法屬於一個叫EventUntil()的物件,這兩個方法均接受三個相同的引數,要操作的元素,事件名稱和事件處理程式函式。

事件型別

**事件型別** 
  滑鼠事件:click、dbclick、mousedown、mouseup、mouseover、mouseout、mousemove  
  鍵盤事件:keydown、keypress、keyup  
  HTML事件:load、unload、abort、error、select、change、submit、reset、
resize、scroll、focus、blur

事件處理器

執行JavaScript 程式碼的程式在事件發生時會對事件做出響應。為了響應一個特定事件
而被執行的程式碼稱為事件處理器。

在HTML標籤中使用事件處理器的語法是:

<HTML標籤 事件處理器="JavaScript程式碼''>

事件處理程式

事件就是使用者或瀏覽器自身執行的某種動作。比如click,mouseup,keydown,mouseover等都是事件的名字。而響應某個事件的函式就叫事件處理程式(事件監聽器),事件處理程式以on開頭,因此click的事件處理程式就是onclick

DOM 0級事件處理程式

DOM 0級事件處理程式:把一個函式賦值給一個事件的處理程式屬性

<input type="button" value="按鈕2" id="ben2"/>
          var btn2=document.getElementById('btn2');獲得btn2按鈕物件
          btn2.onclick            //給btn2新增onclick屬性,屬性又觸發了一個事件處理程式

btn2.onclick=function(){
}                                        //新增匿名函式

btn2.onclick=null           //刪除onclick屬性

如何阻止冒泡?

阻止冒泡有以下方法:

e.cancelBubble=true;
e.stopPropagation();
return false;

innerText、innerHTML、outerHTML、outerText

   innerText、innerHTML、outerHTML、outerText
   innerText: 表示起始標籤和結束標籤之間的文字  
    innerHTML: 表示元素的所有元素和文字的HTML程式碼  
    如:<div><b>Hello</b> world</div>的innerText為Hello world,innerHTML為Hello  world  
    outerText: 與前者的區別是替換的是整個目標節點,問題返回和innerText一樣的內容  
    outerHTML: 與前者的區別是替換的是整個目標節點,返回元素完整的HTML程式碼,包括元素本身

DOM 2級事件處理程式

DOM 2級事件定義了兩個方法,用於指定和刪除事件處理程式的操作。addEventListener()removeEventListener()

addEventListener()和removeEventListener()

在DOM中,addEventListener()和removeEventListener()用來分配和移除事件處理函式,與IE不同的是,這些方法需要三個引數:事件名稱,要分配的函式和處理函式是用於冒泡階段(false)還是捕獲階段(true),預設為冒泡階段false  

[object].addEventListener("name_of_event",fnhander,bcapture)  

[object].removeEventListener("name_of_event",fnhander,bcapture)  

var fnClick = function(){  
    alert("Clicked!");  
}  
oDiv.addEventListener("onclick", fnClick, false);  //新增事件處理函式  

oDiv.addEventListener("onclick", fnClickAnother, false);  // 與IE一樣,可以新增多個事件處理函式  

oDiv.removeEventListener("onclick", fnClick, false);  //移除事件處理函式  

如果使用addEventListener()將事件處理函式加入到捕獲階段,則必須在removeEventListener()中指明是捕獲階段,才能正確地將這個事件處理函式刪除  

oDiv.onclick = fnClick;  

oDiv.onclick = fnClickAnother;  //使用直接賦值,後續的事件處理函式會覆蓋前面的處理函式  

oDiv.onclick = fnClick; 

oDiv.addEventListener("onclick", fnClickAnother, false);  //會按順序進行呼叫,不會覆蓋

一張圖瞭解OUTHTML和innerText、innerHTML:

DOM基本操作思維導圖

更詳細的XML DOM – Element 物件的屬性和方法請訪問w3cshool

BOM 部分

BOM的核心是window,而window物件又具有雙重角色,它既是通過js訪問瀏覽器視窗的一個介面,又是一個Global(全域性)物件。這意味著在網頁中定義的任何物件,變數和函式,都以window作為其global物件。

window.close();  //關閉視窗  

window.alert("message");  //彈出一個具有OK按鈕的系統訊息框,顯示指定的文字 

window.confirm("Are you sure?");  //彈出一個具有OK和Cancel按鈕的詢問對話方塊,返回一個布林值  

window.prompt("What's your name?", "Default");  //提示使用者輸入資訊,接受兩個引數,即要顯示給使用者的文字和文字框中的預設值,將文字框中的值作為函式值返回  

window.status  //可以使狀態列的文字暫時改變  

window.defaultStatus  //預設的狀態列資訊,可在使用者離開當前頁面前一直改變文字  

window.setTimeout("alert('xxx')", 1000);  //設定在指定的毫秒數後執行指定的程式碼,接受2個引數,要執行的程式碼和等待的毫秒數  

window.clearTimeout("ID");  //取消還未執行的暫停,將暫停ID傳遞給它  

window.setInterval(function, 1000);  //無限次地每隔指定的時間段重複一次指定的程式碼,引數同setTimeout()一樣  

window.clearInterval("ID");  //取消時間間隔,將間隔ID傳遞給它  

window.history.go(-1);  //訪問瀏覽器視窗的歷史,負數為後退,正數為前進 

window.history.back();  //同上  

window.history.forward();  //同上  

window.history.length  //可以檢視歷史中的頁面數

document物件

document物件:實際上是window物件的屬性,document == window.document為true,是唯一一個既屬於BOM又屬於DOM的物件  

document.lastModified  //獲取最後一次修改頁面的日期的字串表示  

document.referrer  //用於跟蹤使用者從哪裡連結過來的  

document.title  //獲取當前頁面的標題,可讀寫  

document.URL  //獲取當前頁面的URL,可讀寫  

document.anchors[0]或document.anchors["anchName"] //訪問頁面中所有的錨  

document.forms[0]或document.forms["formName"]  //訪問頁面中所有的表單  

document.images[0]或document.images["imgName"]  // 訪問頁面中所有的影像  

document.links [0]或document.links["linkName"]  //訪問頁面中所有的連結 

document.applets [0]或document.applets["appletName"]  //訪問頁面中所有的Applet  

document.embeds [0]或document.embeds["embedName"]  //訪問頁面中所有的嵌入式物件  

document.write(); 或document.writeln();  //將字串插入到呼叫它們的位置

location物件

location物件:表示載入視窗的URL,也可用window.location引用它  

location.href  //當前載入頁面的完整URL,如http://www.somewhere.com/pictures/index.htm  

location.portocol  //URL中使用的協議,即雙斜槓之前的部分,如http 

location.host  //伺服器的名字,如www.wrox.com  

location.hostname  //通常等於host,有時會省略前面的www  

location.port  //URL宣告的請求的埠,預設情況下,大多數URL沒有埠資訊,如8080 

location.pathname  //URL中主機名後的部分,如/pictures/index.htm  

location.search  //執行GET請求的URL中的問號後的部分,又稱查詢字串,如?param=xxxx  

location.hash  //如果URL包含#,返回該符號之後的內容,如#anchor1  

location.assign("http:www.baidu.com");  //同location.href,新地址都會被加到瀏覽器的歷史棧中  

location.replace("http:www.baidu.com");  //同assign(),但新地址不會被加到瀏覽器的歷史棧中,不能通過back和forward訪問  

location.reload(true | false);  //重新載入當前頁面,為false時從瀏覽器快取中過載,為true時從伺服器端過載,預設為false

navigator物件

 `navigator`物件:包含大量有關Web瀏覽器的資訊,在檢測瀏覽器及作業系統上非常有用,也可用window.navigator引用它  

`navigator.appCodeName`  //瀏覽器程式碼名的字串表示  

navigator.appName  //官方瀏覽器名的字串表示  

navigator.appVersion  //瀏覽器版本資訊的字串表示  

navigator.cookieEnabled  //如果啟用cookie返回true,否則返回false  

navigator.javaEnabled  //如果啟用java返回true,否則返回false  

navigator.platform  //瀏覽器所在計算機平臺的字串表示  

navigator.plugins  //安裝在瀏覽器中的外掛陣列  

navigator.taintEnabled  //如果啟用了資料汙點返回true,否則返回false  

navigator.userAgent  //使用者代理頭的字串表示

screen物件

screen物件:用於獲取某些關於使用者螢幕的資訊,也可用window.screen引用它  

  screen.width/height  //螢幕的寬度與高度,以畫素計  

  screen.availWidth/availHeight  //視窗可以使用的螢幕的寬度和高度,以畫素計 

  screen.colorDepth  //使用者表示顏色的位數,大多數系統採用32位  

  window.moveTo(0, 0);  

  window.resizeTo(screen.availWidth, screen.availHeight);  //填充使用者的螢幕

window物件方法

BOM和DOM的結構關係示意圖

JavaScript學習系列文章目錄

相關文章